intentkit 0.6.13.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 (385) 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 +14 -7
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +5 -2
  8. intentkit/clients/cdp.py +101 -141
  9. intentkit/clients/twitter.py +83 -62
  10. intentkit/clients/web3.py +29 -0
  11. intentkit/config/config.py +8 -5
  12. intentkit/core/agent.py +472 -195
  13. intentkit/core/asset.py +253 -0
  14. intentkit/core/chat.py +51 -0
  15. intentkit/core/client.py +1 -1
  16. intentkit/core/credit.py +460 -130
  17. intentkit/core/engine.py +262 -233
  18. intentkit/core/node.py +15 -16
  19. intentkit/core/prompt.py +62 -28
  20. intentkit/core/scheduler.py +92 -0
  21. intentkit/core/statistics.py +168 -0
  22. intentkit/models/agent.py +1096 -949
  23. intentkit/models/agent_data.py +68 -38
  24. intentkit/models/agent_public.json +98 -0
  25. intentkit/models/agent_schema.json +54 -439
  26. intentkit/models/app_setting.py +96 -33
  27. intentkit/models/chat.py +74 -27
  28. intentkit/models/conversation.py +8 -8
  29. intentkit/models/credit.py +362 -74
  30. intentkit/models/db.py +26 -8
  31. intentkit/models/db_mig.py +2 -2
  32. intentkit/models/llm.csv +28 -0
  33. intentkit/models/llm.py +185 -350
  34. intentkit/models/redis.py +6 -4
  35. intentkit/models/skill.py +186 -72
  36. intentkit/models/skills.csv +174 -0
  37. intentkit/models/user.py +82 -24
  38. intentkit/skills/acolyt/__init__.py +2 -9
  39. intentkit/skills/acolyt/ask.py +3 -4
  40. intentkit/skills/acolyt/base.py +4 -9
  41. intentkit/skills/acolyt/schema.json +4 -3
  42. intentkit/skills/aixbt/__init__.py +2 -13
  43. intentkit/skills/aixbt/base.py +1 -7
  44. intentkit/skills/aixbt/projects.py +14 -15
  45. intentkit/skills/aixbt/schema.json +4 -4
  46. intentkit/skills/allora/__init__.py +2 -9
  47. intentkit/skills/allora/base.py +4 -9
  48. intentkit/skills/allora/price.py +3 -4
  49. intentkit/skills/allora/schema.json +3 -2
  50. intentkit/skills/base.py +248 -85
  51. intentkit/skills/basename/__init__.py +51 -0
  52. intentkit/skills/basename/base.py +11 -0
  53. intentkit/skills/basename/basename.svg +11 -0
  54. intentkit/skills/basename/schema.json +58 -0
  55. intentkit/skills/carv/__init__.py +115 -121
  56. intentkit/skills/carv/base.py +184 -185
  57. intentkit/skills/carv/fetch_news.py +3 -3
  58. intentkit/skills/carv/onchain_query.py +4 -4
  59. intentkit/skills/carv/schema.json +134 -137
  60. intentkit/skills/carv/token_info_and_price.py +5 -5
  61. intentkit/skills/casino/README.md +254 -0
  62. intentkit/skills/casino/__init__.py +86 -0
  63. intentkit/skills/casino/base.py +17 -0
  64. intentkit/skills/casino/casino.png +0 -0
  65. intentkit/skills/casino/deck_draw.py +127 -0
  66. intentkit/skills/casino/deck_shuffle.py +118 -0
  67. intentkit/skills/casino/dice_roll.py +100 -0
  68. intentkit/skills/casino/schema.json +77 -0
  69. intentkit/skills/casino/utils.py +107 -0
  70. intentkit/skills/cdp/__init__.py +22 -84
  71. intentkit/skills/cdp/base.py +1 -7
  72. intentkit/skills/cdp/schema.json +11 -314
  73. intentkit/skills/chainlist/__init__.py +2 -7
  74. intentkit/skills/chainlist/base.py +1 -7
  75. intentkit/skills/chainlist/chain_lookup.py +18 -18
  76. intentkit/skills/chainlist/schema.json +3 -5
  77. intentkit/skills/common/__init__.py +2 -9
  78. intentkit/skills/common/base.py +1 -7
  79. intentkit/skills/common/current_time.py +1 -2
  80. intentkit/skills/common/schema.json +2 -2
  81. intentkit/skills/cookiefun/__init__.py +6 -9
  82. intentkit/skills/cookiefun/base.py +2 -7
  83. intentkit/skills/cookiefun/get_account_details.py +7 -7
  84. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  85. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  86. intentkit/skills/cookiefun/get_sectors.py +3 -3
  87. intentkit/skills/cookiefun/schema.json +1 -3
  88. intentkit/skills/cookiefun/search_accounts.py +9 -9
  89. intentkit/skills/cryptocompare/__init__.py +7 -24
  90. intentkit/skills/cryptocompare/api.py +2 -3
  91. intentkit/skills/cryptocompare/base.py +11 -25
  92. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  93. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  94. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  95. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  96. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  97. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  98. intentkit/skills/cryptocompare/schema.json +3 -3
  99. intentkit/skills/cryptopanic/__init__.py +7 -10
  100. intentkit/skills/cryptopanic/base.py +51 -55
  101. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  102. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  103. intentkit/skills/cryptopanic/schema.json +105 -103
  104. intentkit/skills/dapplooker/__init__.py +2 -9
  105. intentkit/skills/dapplooker/base.py +4 -9
  106. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  107. intentkit/skills/dapplooker/schema.json +3 -5
  108. intentkit/skills/defillama/__init__.py +24 -74
  109. intentkit/skills/defillama/api.py +6 -9
  110. intentkit/skills/defillama/base.py +11 -21
  111. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  112. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  113. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  114. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  115. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  116. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  117. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  118. intentkit/skills/defillama/config/chains.py +1 -3
  119. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  120. intentkit/skills/defillama/schema.json +5 -1
  121. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  122. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  123. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  124. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  125. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  126. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  127. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  128. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  129. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  130. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  131. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  132. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  133. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  134. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  135. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  136. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  137. intentkit/skills/dexscreener/README.md +154 -0
  138. intentkit/skills/dexscreener/__init__.py +97 -93
  139. intentkit/skills/dexscreener/base.py +125 -133
  140. intentkit/skills/dexscreener/get_pair_info.py +158 -0
  141. intentkit/skills/dexscreener/get_token_pairs.py +165 -0
  142. intentkit/skills/dexscreener/get_tokens_info.py +212 -0
  143. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  144. intentkit/skills/dexscreener/schema.json +91 -48
  145. intentkit/skills/dexscreener/search_token.py +182 -321
  146. intentkit/skills/dexscreener/utils.py +420 -0
  147. intentkit/skills/dune_analytics/__init__.py +7 -9
  148. intentkit/skills/dune_analytics/base.py +48 -52
  149. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  150. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  151. intentkit/skills/dune_analytics/schema.json +104 -99
  152. intentkit/skills/elfa/__init__.py +5 -18
  153. intentkit/skills/elfa/base.py +10 -14
  154. intentkit/skills/elfa/mention.py +19 -21
  155. intentkit/skills/elfa/schema.json +3 -2
  156. intentkit/skills/elfa/stats.py +4 -4
  157. intentkit/skills/elfa/tokens.py +12 -12
  158. intentkit/skills/elfa/utils.py +26 -28
  159. intentkit/skills/enso/__init__.py +11 -31
  160. intentkit/skills/enso/base.py +50 -35
  161. intentkit/skills/enso/best_yield.py +16 -24
  162. intentkit/skills/enso/networks.py +6 -11
  163. intentkit/skills/enso/prices.py +11 -13
  164. intentkit/skills/enso/route.py +34 -38
  165. intentkit/skills/enso/schema.json +3 -2
  166. intentkit/skills/enso/tokens.py +29 -38
  167. intentkit/skills/enso/wallet.py +76 -191
  168. intentkit/skills/erc20/__init__.py +50 -0
  169. intentkit/skills/erc20/base.py +11 -0
  170. intentkit/skills/erc20/erc20.svg +5 -0
  171. intentkit/skills/erc20/schema.json +74 -0
  172. intentkit/skills/erc721/__init__.py +53 -0
  173. intentkit/skills/erc721/base.py +11 -0
  174. intentkit/skills/erc721/erc721.svg +5 -0
  175. intentkit/skills/erc721/schema.json +90 -0
  176. intentkit/skills/firecrawl/README.md +11 -5
  177. intentkit/skills/firecrawl/__init__.py +5 -18
  178. intentkit/skills/firecrawl/base.py +4 -11
  179. intentkit/skills/firecrawl/clear.py +4 -8
  180. intentkit/skills/firecrawl/crawl.py +19 -19
  181. intentkit/skills/firecrawl/query.py +4 -3
  182. intentkit/skills/firecrawl/schema.json +6 -8
  183. intentkit/skills/firecrawl/scrape.py +150 -40
  184. intentkit/skills/firecrawl/utils.py +50 -42
  185. intentkit/skills/github/__init__.py +2 -7
  186. intentkit/skills/github/base.py +1 -7
  187. intentkit/skills/github/github_search.py +1 -2
  188. intentkit/skills/github/schema.json +3 -4
  189. intentkit/skills/heurist/__init__.py +8 -27
  190. intentkit/skills/heurist/base.py +4 -9
  191. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  192. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  193. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  194. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  195. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  196. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  197. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  198. intentkit/skills/heurist/schema.json +2 -2
  199. intentkit/skills/http/__init__.py +4 -15
  200. intentkit/skills/http/base.py +1 -7
  201. intentkit/skills/http/get.py +21 -16
  202. intentkit/skills/http/post.py +23 -18
  203. intentkit/skills/http/put.py +23 -18
  204. intentkit/skills/http/schema.json +4 -5
  205. intentkit/skills/lifi/__init__.py +8 -13
  206. intentkit/skills/lifi/base.py +1 -7
  207. intentkit/skills/lifi/schema.json +17 -8
  208. intentkit/skills/lifi/token_execute.py +36 -30
  209. intentkit/skills/lifi/token_quote.py +8 -10
  210. intentkit/skills/lifi/utils.py +104 -51
  211. intentkit/skills/moralis/__init__.py +6 -10
  212. intentkit/skills/moralis/api.py +6 -7
  213. intentkit/skills/moralis/base.py +5 -10
  214. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  215. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  216. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  217. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  218. intentkit/skills/moralis/schema.json +7 -2
  219. intentkit/skills/morpho/__init__.py +52 -0
  220. intentkit/skills/morpho/base.py +11 -0
  221. intentkit/skills/morpho/morpho.svg +12 -0
  222. intentkit/skills/morpho/schema.json +73 -0
  223. intentkit/skills/nation/__init__.py +4 -9
  224. intentkit/skills/nation/base.py +5 -10
  225. intentkit/skills/nation/nft_check.py +3 -4
  226. intentkit/skills/nation/schema.json +4 -3
  227. intentkit/skills/onchain.py +23 -0
  228. intentkit/skills/openai/__init__.py +17 -18
  229. intentkit/skills/openai/base.py +10 -14
  230. intentkit/skills/openai/dalle_image_generation.py +3 -8
  231. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  232. intentkit/skills/openai/gpt_image_generation.py +4 -8
  233. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  234. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  235. intentkit/skills/openai/image_to_text.py +3 -7
  236. intentkit/skills/openai/schema.json +34 -3
  237. intentkit/skills/portfolio/__init__.py +11 -35
  238. intentkit/skills/portfolio/base.py +33 -19
  239. intentkit/skills/portfolio/schema.json +3 -5
  240. intentkit/skills/portfolio/token_balances.py +21 -21
  241. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  242. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  243. intentkit/skills/portfolio/wallet_history.py +31 -31
  244. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  245. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  246. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  247. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  248. intentkit/skills/portfolio/wallet_stats.py +3 -3
  249. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  250. intentkit/skills/pyth/__init__.py +50 -0
  251. intentkit/skills/pyth/base.py +11 -0
  252. intentkit/skills/pyth/pyth.svg +6 -0
  253. intentkit/skills/pyth/schema.json +75 -0
  254. intentkit/skills/skills.toml +40 -0
  255. intentkit/skills/slack/__init__.py +5 -17
  256. intentkit/skills/slack/base.py +3 -9
  257. intentkit/skills/slack/get_channel.py +8 -8
  258. intentkit/skills/slack/get_message.py +9 -9
  259. intentkit/skills/slack/schedule_message.py +5 -5
  260. intentkit/skills/slack/schema.json +2 -2
  261. intentkit/skills/slack/send_message.py +3 -5
  262. intentkit/skills/supabase/__init__.py +7 -23
  263. intentkit/skills/supabase/base.py +9 -13
  264. intentkit/skills/supabase/delete_data.py +5 -6
  265. intentkit/skills/supabase/fetch_data.py +13 -14
  266. intentkit/skills/supabase/insert_data.py +5 -6
  267. intentkit/skills/supabase/invoke_function.py +7 -8
  268. intentkit/skills/supabase/schema.json +2 -3
  269. intentkit/skills/supabase/update_data.py +7 -8
  270. intentkit/skills/supabase/upsert_data.py +5 -6
  271. intentkit/skills/superfluid/__init__.py +53 -0
  272. intentkit/skills/superfluid/base.py +11 -0
  273. intentkit/skills/superfluid/schema.json +89 -0
  274. intentkit/skills/superfluid/superfluid.svg +6 -0
  275. intentkit/skills/system/__init__.py +7 -24
  276. intentkit/skills/system/add_autonomous_task.py +10 -12
  277. intentkit/skills/system/delete_autonomous_task.py +2 -2
  278. intentkit/skills/system/edit_autonomous_task.py +14 -18
  279. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  280. intentkit/skills/system/read_agent_api_key.py +6 -4
  281. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  282. intentkit/skills/system/schema.json +6 -8
  283. intentkit/skills/tavily/__init__.py +3 -12
  284. intentkit/skills/tavily/base.py +4 -9
  285. intentkit/skills/tavily/schema.json +3 -5
  286. intentkit/skills/tavily/tavily_extract.py +2 -4
  287. intentkit/skills/tavily/tavily_search.py +4 -6
  288. intentkit/skills/token/__init__.py +5 -10
  289. intentkit/skills/token/base.py +7 -11
  290. intentkit/skills/token/erc20_transfers.py +19 -19
  291. intentkit/skills/token/schema.json +3 -6
  292. intentkit/skills/token/token_analytics.py +3 -3
  293. intentkit/skills/token/token_price.py +13 -13
  294. intentkit/skills/token/token_search.py +9 -9
  295. intentkit/skills/twitter/__init__.py +11 -35
  296. intentkit/skills/twitter/base.py +23 -35
  297. intentkit/skills/twitter/follow_user.py +3 -7
  298. intentkit/skills/twitter/get_mentions.py +6 -13
  299. intentkit/skills/twitter/get_timeline.py +5 -13
  300. intentkit/skills/twitter/get_user_by_username.py +3 -7
  301. intentkit/skills/twitter/get_user_tweets.py +6 -14
  302. intentkit/skills/twitter/like_tweet.py +3 -7
  303. intentkit/skills/twitter/post_tweet.py +23 -12
  304. intentkit/skills/twitter/reply_tweet.py +21 -12
  305. intentkit/skills/twitter/retweet.py +3 -7
  306. intentkit/skills/twitter/schema.json +1 -0
  307. intentkit/skills/twitter/search_tweets.py +5 -13
  308. intentkit/skills/unrealspeech/__init__.py +2 -7
  309. intentkit/skills/unrealspeech/base.py +2 -8
  310. intentkit/skills/unrealspeech/schema.json +2 -5
  311. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  312. intentkit/skills/venice_audio/__init__.py +98 -106
  313. intentkit/skills/venice_audio/base.py +117 -121
  314. intentkit/skills/venice_audio/input.py +41 -41
  315. intentkit/skills/venice_audio/schema.json +151 -152
  316. intentkit/skills/venice_audio/venice_audio.py +38 -21
  317. intentkit/skills/venice_image/__init__.py +147 -154
  318. intentkit/skills/venice_image/api.py +138 -138
  319. intentkit/skills/venice_image/base.py +185 -192
  320. intentkit/skills/venice_image/config.py +33 -35
  321. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  322. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  323. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  324. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  325. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  326. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  328. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  329. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  330. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  332. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  333. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  334. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  335. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  336. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  337. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  338. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  339. intentkit/skills/venice_image/schema.json +267 -267
  340. intentkit/skills/venice_image/utils.py +77 -78
  341. intentkit/skills/web_scraper/__init__.py +5 -18
  342. intentkit/skills/web_scraper/base.py +21 -7
  343. intentkit/skills/web_scraper/document_indexer.py +7 -6
  344. intentkit/skills/web_scraper/schema.json +2 -6
  345. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  346. intentkit/skills/web_scraper/utils.py +62 -63
  347. intentkit/skills/web_scraper/website_indexer.py +17 -19
  348. intentkit/skills/weth/__init__.py +49 -0
  349. intentkit/skills/weth/base.py +11 -0
  350. intentkit/skills/weth/schema.json +58 -0
  351. intentkit/skills/weth/weth.svg +6 -0
  352. intentkit/skills/wow/__init__.py +51 -0
  353. intentkit/skills/wow/base.py +11 -0
  354. intentkit/skills/wow/schema.json +89 -0
  355. intentkit/skills/wow/wow.svg +7 -0
  356. intentkit/skills/x402/__init__.py +61 -0
  357. intentkit/skills/x402/ask_agent.py +98 -0
  358. intentkit/skills/x402/base.py +99 -0
  359. intentkit/skills/x402/http_request.py +117 -0
  360. intentkit/skills/x402/schema.json +45 -0
  361. intentkit/skills/x402/x402.webp +0 -0
  362. intentkit/skills/xmtp/__init__.py +4 -15
  363. intentkit/skills/xmtp/base.py +61 -2
  364. intentkit/skills/xmtp/price.py +18 -13
  365. intentkit/skills/xmtp/schema.json +69 -71
  366. intentkit/skills/xmtp/swap.py +22 -25
  367. intentkit/skills/xmtp/transfer.py +71 -32
  368. intentkit/utils/chain.py +3 -3
  369. intentkit/utils/error.py +14 -1
  370. intentkit/utils/logging.py +2 -4
  371. intentkit/utils/s3.py +59 -7
  372. intentkit/utils/schema.py +100 -0
  373. intentkit/utils/slack_alert.py +7 -8
  374. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
  375. intentkit-0.8.17.dist-info/RECORD +466 -0
  376. intentkit/abstracts/exception.py +0 -9
  377. intentkit/core/skill.py +0 -200
  378. intentkit/models/generator.py +0 -347
  379. intentkit/skills/cdp/get_balance.py +0 -110
  380. intentkit/skills/cdp/swap.py +0 -121
  381. intentkit/skills/moralis/tests/__init__.py +0 -0
  382. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  383. intentkit-0.6.13.dev2.dist-info/RECORD +0 -409
  384. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  385. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,6 @@
1
1
  """fetching wallet portfolio for a specific blockchain."""
2
2
 
3
3
  import logging
4
- from typing import List, Optional, Type
5
4
 
6
5
  from pydantic import BaseModel, Field
7
6
 
@@ -27,7 +26,7 @@ class ChainTokenBalance(BaseModel):
27
26
  contract_address: str = Field(..., description="Token contract address")
28
27
  symbol: str = Field(..., description="Token symbol")
29
28
  name: str = Field(..., description="Token name")
30
- logo: Optional[str] = Field(None, description="Token logo URL")
29
+ logo: str | None = Field(None, description="Token logo URL")
31
30
  decimals: int = Field(..., description="Token decimals")
32
31
  balance: float = Field(..., description="Token balance")
33
32
  balance_raw: str = Field(..., description="Raw token balance")
@@ -38,12 +37,12 @@ class TokenApproval(BaseModel):
38
37
  """Model for token approval."""
39
38
 
40
39
  token_address: str = Field(..., description="Token contract address")
41
- token_symbol: Optional[str] = Field(None, description="Token symbol")
42
- token_name: Optional[str] = Field(None, description="Token name")
40
+ token_symbol: str | None = Field(None, description="Token symbol")
41
+ token_name: str | None = Field(None, description="Token name")
43
42
  spender: str = Field(..., description="Spender address (contract)")
44
- spender_name: Optional[str] = Field(None, description="Spender name if known")
43
+ spender_name: str | None = Field(None, description="Spender name if known")
45
44
  allowance: str = Field(..., description="Raw approval amount")
46
- allowance_formatted: Optional[float] = Field(
45
+ allowance_formatted: float | None = Field(
47
46
  None, description="Formatted approval amount"
48
47
  )
49
48
  unlimited: bool = Field(False, description="Whether the approval is unlimited")
@@ -55,17 +54,17 @@ class ChainPortfolioOutput(BaseModel):
55
54
  address: str = Field(..., description="Wallet address")
56
55
  chain_id: int = Field(..., description="Chain ID")
57
56
  chain_name: str = Field(..., description="Chain name")
58
- native_token: Optional[ChainTokenBalance] = Field(
57
+ native_token: ChainTokenBalance | None = Field(
59
58
  None, description="Native token balance"
60
59
  )
61
- tokens: List[ChainTokenBalance] = Field(
60
+ tokens: list[ChainTokenBalance] = Field(
62
61
  default_factory=list, description="List of token balances"
63
62
  )
64
63
  total_usd_value: float = Field(0.0, description="Total USD value on this chain")
65
- approvals: Optional[List[TokenApproval]] = Field(
64
+ approvals: list[TokenApproval] | None = Field(
66
65
  None, description="Token approvals if requested"
67
66
  )
68
- error: Optional[str] = Field(None, description="Error message if any")
67
+ error: str | None = Field(None, description="Error message if any")
69
68
 
70
69
 
71
70
  class FetchChainPortfolio(WalletBaseTool):
@@ -87,7 +86,7 @@ class FetchChainPortfolio(WalletBaseTool):
87
86
  "- Token approvals (optional)\n"
88
87
  "Use this tool whenever a user wants to see their holdings on a specific blockchain."
89
88
  )
90
- args_schema: Type[BaseModel] = FetchChainPortfolioInput
89
+ args_schema: type[BaseModel] = FetchChainPortfolioInput
91
90
 
92
91
  async def _arun(
93
92
  self, address: str, chain_id: int, include_approvals: bool = False, **kwargs
@@ -2,7 +2,7 @@
2
2
 
3
3
  import json
4
4
  import logging
5
- from typing import Any, Dict, List, Optional, Type
5
+ from typing import Any
6
6
 
7
7
  from pydantic import BaseModel, Field
8
8
 
@@ -16,7 +16,7 @@ class FetchNftPortfolioInput(BaseModel):
16
16
  """Input for FetchNftPortfolio tool."""
17
17
 
18
18
  address: str = Field(..., description="Wallet address")
19
- chain_id: Optional[int] = Field(
19
+ chain_id: int | None = Field(
20
20
  None,
21
21
  description="Chain ID (if not specified, fetches from all supported chains)",
22
22
  )
@@ -26,7 +26,7 @@ class FetchNftPortfolioInput(BaseModel):
26
26
  solana_network: str = Field(
27
27
  default="mainnet", description="Solana network to use (mainnet or devnet)"
28
28
  )
29
- limit: Optional[int] = Field(100, description="Maximum number of NFTs to return")
29
+ limit: int | None = Field(100, description="Maximum number of NFTs to return")
30
30
  normalize_metadata: bool = Field(
31
31
  True, description="Whether to normalize metadata across different standards"
32
32
  )
@@ -35,12 +35,12 @@ class FetchNftPortfolioInput(BaseModel):
35
35
  class NftMetadata(BaseModel):
36
36
  """Model for NFT metadata."""
37
37
 
38
- name: Optional[str] = Field(None, description="NFT name")
39
- description: Optional[str] = Field(None, description="NFT description")
40
- image: Optional[str] = Field(None, description="NFT image URL")
41
- animation_url: Optional[str] = Field(None, description="NFT animation URL")
42
- attributes: Optional[List[Dict]] = Field(None, description="NFT attributes/traits")
43
- external_url: Optional[str] = Field(None, description="External URL")
38
+ name: str | None = Field(None, description="NFT name")
39
+ description: str | None = Field(None, description="NFT description")
40
+ image: str | None = Field(None, description="NFT image URL")
41
+ animation_url: str | None = Field(None, description="NFT animation URL")
42
+ attributes: list[dict] | None = Field(None, description="NFT attributes/traits")
43
+ external_url: str | None = Field(None, description="External URL")
44
44
 
45
45
 
46
46
  class NftItem(BaseModel):
@@ -48,14 +48,14 @@ class NftItem(BaseModel):
48
48
 
49
49
  token_id: str = Field(..., description="NFT token ID")
50
50
  token_address: str = Field(..., description="NFT contract address")
51
- contract_type: Optional[str] = Field(
51
+ contract_type: str | None = Field(
52
52
  None, description="NFT contract type (ERC721, ERC1155, etc.)"
53
53
  )
54
- name: Optional[str] = Field(None, description="NFT name")
55
- symbol: Optional[str] = Field(None, description="NFT symbol")
54
+ name: str | None = Field(None, description="NFT name")
55
+ symbol: str | None = Field(None, description="NFT symbol")
56
56
  owner_of: str = Field(..., description="Owner address")
57
- metadata: Optional[NftMetadata] = Field(None, description="NFT metadata")
58
- floor_price: Optional[float] = Field(None, description="Floor price if available")
57
+ metadata: NftMetadata | None = Field(None, description="NFT metadata")
58
+ floor_price: float | None = Field(None, description="Floor price if available")
59
59
  chain: str = Field("eth", description="Blockchain network")
60
60
 
61
61
 
@@ -63,13 +63,13 @@ class NftPortfolioOutput(BaseModel):
63
63
  """Output for FetchNftPortfolio tool."""
64
64
 
65
65
  address: str = Field(..., description="Wallet address")
66
- nfts: List[NftItem] = Field(default_factory=list, description="List of NFT items")
66
+ nfts: list[NftItem] = Field(default_factory=list, description="List of NFT items")
67
67
  total_count: int = Field(0, description="Total count of NFTs")
68
- chains: List[str] = Field(
68
+ chains: list[str] = Field(
69
69
  default_factory=list, description="Chains included in the response"
70
70
  )
71
- cursor: Optional[str] = Field(None, description="Cursor for pagination")
72
- error: Optional[str] = Field(None, description="Error message if any")
71
+ cursor: str | None = Field(None, description="Cursor for pagination")
72
+ error: str | None = Field(None, description="Error message if any")
73
73
 
74
74
 
75
75
  class FetchNftPortfolio(WalletBaseTool):
@@ -90,12 +90,12 @@ class FetchNftPortfolio(WalletBaseTool):
90
90
  "- Floor prices if available\n"
91
91
  "Use this tool whenever a user asks about their NFTs or digital collectibles."
92
92
  )
93
- args_schema: Type[BaseModel] = FetchNftPortfolioInput
93
+ args_schema: type[BaseModel] = FetchNftPortfolioInput
94
94
 
95
95
  async def _arun(
96
96
  self,
97
97
  address: str,
98
- chain_id: Optional[int] = None,
98
+ chain_id: int | None = None,
99
99
  include_solana: bool = False,
100
100
  solana_network: str = "mainnet",
101
101
  limit: int = 100,
@@ -156,7 +156,7 @@ class FetchNftPortfolio(WalletBaseTool):
156
156
  chain_id: int,
157
157
  limit: int,
158
158
  normalize_metadata: bool,
159
- result: Dict[str, Any],
159
+ result: dict[str, Any],
160
160
  ) -> None:
161
161
  """Fetch NFTs from an EVM chain.
162
162
 
@@ -222,7 +222,7 @@ class FetchNftPortfolio(WalletBaseTool):
222
222
  result["nfts"].append(nft_item)
223
223
 
224
224
  async def _fetch_solana_nfts(
225
- self, address: str, network: str, limit: int, result: Dict[str, Any]
225
+ self, address: str, network: str, limit: int, result: dict[str, Any]
226
226
  ) -> None:
227
227
  """Fetch NFTs from Solana.
228
228
 
@@ -1,7 +1,6 @@
1
1
  """fetching Solana wallet portfolio."""
2
2
 
3
3
  import logging
4
- from typing import Dict, List, Optional, Type
5
4
 
6
5
  from pydantic import BaseModel, Field
7
6
 
@@ -48,17 +47,17 @@ class SolanaTokenBalance(BaseModel):
48
47
  token_info: SolanaTokenInfo
49
48
  amount: float
50
49
  amount_raw: str
51
- usd_value: Optional[float] = 0.0
50
+ usd_value: float | None = 0.0
52
51
 
53
52
 
54
53
  class SolanaNftInfo(BaseModel):
55
54
  """Model for Solana NFT information."""
56
55
 
57
56
  mint: str
58
- name: Optional[str] = None
59
- symbol: Optional[str] = None
57
+ name: str | None = None
58
+ symbol: str | None = None
60
59
  associated_token_address: str
61
- metadata: Optional[Dict] = None
60
+ metadata: dict | None = None
62
61
 
63
62
 
64
63
  class SolanaPortfolioOutput(BaseModel):
@@ -67,12 +66,12 @@ class SolanaPortfolioOutput(BaseModel):
67
66
  address: str
68
67
  sol_balance: float
69
68
  sol_balance_lamports: int
70
- sol_price_usd: Optional[float] = None
71
- sol_value_usd: Optional[float] = None
72
- tokens: List[SolanaTokenBalance] = []
73
- nfts: List[SolanaNftInfo] = []
69
+ sol_price_usd: float | None = None
70
+ sol_value_usd: float | None = None
71
+ tokens: list[SolanaTokenBalance] = []
72
+ nfts: list[SolanaNftInfo] = []
74
73
  total_value_usd: float = 0.0
75
- error: Optional[str] = None
74
+ error: str | None = None
76
75
 
77
76
 
78
77
  class FetchSolanaPortfolio(WalletBaseTool):
@@ -91,7 +90,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
91
90
  "- USD values of assets\n"
92
91
  "Use this tool whenever the user asks specifically about Solana holdings."
93
92
  )
94
- args_schema: Type[BaseModel] = SolanaPortfolioInput
93
+ args_schema: type[BaseModel] = SolanaPortfolioInput
95
94
 
96
95
  async def _arun(
97
96
  self,
@@ -136,7 +135,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
136
135
  self,
137
136
  address: str,
138
137
  network: str,
139
- sol_portfolio: Dict,
138
+ sol_portfolio: dict,
140
139
  include_nfts: bool,
141
140
  include_price_data: bool,
142
141
  ) -> SolanaPortfolioOutput:
@@ -1,7 +1,6 @@
1
1
  """fetching a complete wallet portfolio (EVM + Solana)."""
2
2
 
3
3
  import logging
4
- from typing import Dict, List, Optional, Type
5
4
 
6
5
  from pydantic import BaseModel, Field
7
6
 
@@ -24,7 +23,7 @@ class FetchWalletPortfolioInput(BaseModel):
24
23
  address: str = Field(
25
24
  ..., description="Wallet address to analyze (Ethereum or Solana)"
26
25
  )
27
- chains: Optional[List[int]] = Field(
26
+ chains: list[int] | None = Field(
28
27
  default=None,
29
28
  description="List of EVM chain IDs to check (default: all supported)",
30
29
  )
@@ -51,9 +50,9 @@ class PortfolioOutput(BaseModel):
51
50
 
52
51
  address: str
53
52
  total_net_worth: float
54
- chains: Dict[str, float]
55
- tokens: List[TokenBalance]
56
- error: Optional[str] = None
53
+ chains: dict[str, float]
54
+ tokens: list[TokenBalance]
55
+ error: str | None = None
57
56
 
58
57
 
59
58
  class FetchWalletPortfolio(WalletBaseTool):
@@ -73,12 +72,12 @@ class FetchWalletPortfolio(WalletBaseTool):
73
72
  "Use this tool whenever the user asks about their crypto holdings, portfolio value, "
74
73
  "or wallet contents across multiple blockchains."
75
74
  )
76
- args_schema: Type[BaseModel] = FetchWalletPortfolioInput
75
+ args_schema: type[BaseModel] = FetchWalletPortfolioInput
77
76
 
78
77
  async def _arun(
79
78
  self,
80
79
  address: str,
81
- chains: Optional[List[int]] = None,
80
+ chains: list[int] | None = None,
82
81
  include_solana: bool = True,
83
82
  solana_network: str = "mainnet",
84
83
  **kwargs,
@@ -119,7 +118,7 @@ class FetchWalletPortfolio(WalletBaseTool):
119
118
  )
120
119
 
121
120
  async def _fetch_evm_portfolio(
122
- self, address: str, chains: Optional[List[int]], portfolio: Dict
121
+ self, address: str, chains: list[int] | None, portfolio: dict
123
122
  ) -> None:
124
123
  """Fetch portfolio data for EVM chains.
125
124
 
@@ -165,7 +164,7 @@ class FetchWalletPortfolio(WalletBaseTool):
165
164
  )
166
165
 
167
166
  async def _fetch_solana_portfolio(
168
- self, address: str, network: str, portfolio: Dict
167
+ self, address: str, network: str, portfolio: dict
169
168
  ) -> None:
170
169
  """Fetch portfolio data for Solana.
171
170
 
@@ -152,5 +152,10 @@
152
152
  ]
153
153
  }
154
154
  },
155
- "additionalProperties": true
156
- }
155
+ "additionalProperties": true,
156
+ "x-tags": [
157
+ "Analytics",
158
+ "Crypto",
159
+ "DeFi"
160
+ ]
161
+ }
@@ -0,0 +1,52 @@
1
+ """Morpho AgentKit skills."""
2
+
3
+ from typing import TypedDict
4
+
5
+ from coinbase_agentkit import morpho_action_provider
6
+
7
+ from intentkit.models.agent import Agent
8
+ from intentkit.skills.base import (
9
+ SkillConfig,
10
+ SkillState,
11
+ action_to_structured_tool,
12
+ get_agentkit_actions,
13
+ )
14
+ from intentkit.skills.morpho.base import MorphoBaseTool
15
+
16
+
17
+ class SkillStates(TypedDict):
18
+ MorphoActionProvider_deposit: SkillState
19
+ MorphoActionProvider_withdraw: SkillState
20
+
21
+
22
+ class Config(SkillConfig):
23
+ """Configuration for Morpho skills."""
24
+
25
+ states: SkillStates
26
+
27
+
28
+ async def get_skills(
29
+ config: Config,
30
+ is_private: bool,
31
+ agent_id: str,
32
+ agent: Agent | None = None,
33
+ **_,
34
+ ) -> list[MorphoBaseTool]:
35
+ """Get all Morpho skills."""
36
+
37
+ available_skills: list[str] = []
38
+ for skill_name, state in config["states"].items():
39
+ if state == "disabled":
40
+ continue
41
+ if state == "public" or (state == "private" and is_private):
42
+ available_skills.append(skill_name)
43
+
44
+ actions = await get_agentkit_actions(
45
+ agent_id, [morpho_action_provider], agent=agent
46
+ )
47
+ tools: list[MorphoBaseTool] = []
48
+ for skill in available_skills:
49
+ for action in actions:
50
+ if action.name.endswith(skill):
51
+ tools.append(action_to_structured_tool(action))
52
+ return tools
@@ -0,0 +1,11 @@
1
+ """Morpho AgentKit skills base class."""
2
+
3
+ from intentkit.skills.cdp.base import CDPBaseTool
4
+
5
+
6
+ class MorphoBaseTool(CDPBaseTool):
7
+ """Base class for Morpho tools."""
8
+
9
+ @property
10
+ def category(self) -> str:
11
+ return "morpho"
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
2
+ <defs>
3
+ <radialGradient id="morpho" cx="50%" cy="50%" r="70%">
4
+ <stop offset="0%" stop-color="#82f3ff" />
5
+ <stop offset="100%" stop-color="#006064" />
6
+ </radialGradient>
7
+ </defs>
8
+ <rect width="128" height="128" fill="#004d40" rx="16" />
9
+ <circle cx="64" cy="48" r="28" fill="url(#morpho)" />
10
+ <rect x="36" y="72" width="56" height="20" rx="10" fill="#26a69a" />
11
+ <text x="50%" y="84%" font-family="Arial,Helvetica,sans-serif" font-size="18" fill="#e0f2f1" font-weight="600" text-anchor="middle">Morpho</text>
12
+ </svg>
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "Morpho",
5
+ "description": "Morpho lending actions via Coinbase AgentKit",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/morpho/morpho.svg",
7
+ "x-tags": [
8
+ "DeFi"
9
+ ],
10
+ "properties": {
11
+ "enabled": {
12
+ "type": "boolean",
13
+ "title": "Enabled",
14
+ "description": "Whether this skill is enabled",
15
+ "default": false
16
+ },
17
+ "states": {
18
+ "type": "object",
19
+ "properties": {
20
+ "MorphoActionProvider_deposit": {
21
+ "type": "string",
22
+ "title": "Deposit",
23
+ "enum": [
24
+ "disabled",
25
+ "public",
26
+ "private"
27
+ ],
28
+ "x-enum-title": [
29
+ "Disabled",
30
+ "Agent Owner + All Users",
31
+ "Agent Owner Only"
32
+ ],
33
+ "description": "State for MorphoActionProvider_deposit",
34
+ "default": "disabled"
35
+ },
36
+ "MorphoActionProvider_withdraw": {
37
+ "type": "string",
38
+ "title": "Withdraw",
39
+ "enum": [
40
+ "disabled",
41
+ "public",
42
+ "private"
43
+ ],
44
+ "x-enum-title": [
45
+ "Disabled",
46
+ "Agent Owner + All Users",
47
+ "Agent Owner Only"
48
+ ],
49
+ "description": "State for MorphoActionProvider_withdraw",
50
+ "default": "disabled"
51
+ }
52
+ },
53
+ "description": "States for each Morpho skill (disabled, public, or private)"
54
+ },
55
+ "api_key_provider": {
56
+ "type": "string",
57
+ "title": "API Key Provider",
58
+ "description": "Who provides the API key",
59
+ "enum": [
60
+ "platform"
61
+ ],
62
+ "x-enum-title": [
63
+ "Nation Hosted"
64
+ ],
65
+ "default": "platform"
66
+ }
67
+ },
68
+ "required": [
69
+ "states",
70
+ "enabled"
71
+ ],
72
+ "additionalProperties": true
73
+ }
@@ -1,7 +1,6 @@
1
1
  import logging
2
- from typing import Optional, TypedDict
2
+ from typing import TypedDict
3
3
 
4
- from intentkit.abstracts.skill import SkillStoreABC
5
4
  from intentkit.skills.base import SkillConfig, SkillState
6
5
  from intentkit.skills.nation.base import NationBaseTool
7
6
  from intentkit.skills.nation.nft_check import NftCheck
@@ -25,7 +24,6 @@ class Config(SkillConfig):
25
24
  async def get_skills(
26
25
  config: "Config",
27
26
  is_private: bool,
28
- store: SkillStoreABC,
29
27
  **_,
30
28
  ) -> list[NationBaseTool]:
31
29
  """Get all nation skills."""
@@ -42,20 +40,17 @@ async def get_skills(
42
40
  return [
43
41
  skill
44
42
  for name in available_skills
45
- if (skill := get_nation_skill(name, store)) is not None
43
+ if (skill := get_nation_skill(name)) is not None
46
44
  ]
47
45
 
48
46
 
49
47
  def get_nation_skill(
50
48
  name: str,
51
- store: SkillStoreABC,
52
- ) -> Optional[NationBaseTool]:
49
+ ) -> NationBaseTool | None:
53
50
  """Get a nation skill by name."""
54
51
  if name == "nft_check":
55
52
  if name not in _cache:
56
- _cache[name] = NftCheck(
57
- skill_store=store,
58
- )
53
+ _cache[name] = NftCheck()
59
54
  return _cache[name]
60
55
  else:
61
56
  logger.error(f"Unknown Nation skill: {name}")
@@ -1,8 +1,6 @@
1
- from typing import Type
2
-
3
1
  from pydantic import BaseModel, Field
4
2
 
5
- from intentkit.abstracts.skill import SkillStoreABC
3
+ from intentkit.config.config import config
6
4
  from intentkit.skills.base import IntentKitSkill
7
5
 
8
6
  default_nation_api_url = "http://backend-api"
@@ -13,17 +11,14 @@ class NationBaseTool(IntentKitSkill):
13
11
 
14
12
  name: str = Field(description="The name of the tool")
15
13
  description: str = Field(description="A description of what the tool does")
16
- args_schema: Type[BaseModel]
17
- skill_store: SkillStoreABC = Field(
18
- description="The skill store for persisting data"
19
- )
14
+ args_schema: type[BaseModel]
20
15
 
21
16
  def get_api_key(self) -> str:
22
- return self.skill_store.get_system_config("nation_api_key")
17
+ return config.nation_api_key
23
18
 
24
19
  def get_base_url(self) -> str:
25
- if self.skill_store.get_system_config("nation_api_url"):
26
- return self.skill_store.get_system_config("nation_api_url")
20
+ if config.nation_api_url:
21
+ return config.nation_api_url
27
22
  return default_nation_api_url
28
23
 
29
24
  @property
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from eth_utils import is_address
@@ -11,7 +10,7 @@ logger = logging.getLogger(__name__)
11
10
 
12
11
 
13
12
  class NftCheckInput(BaseModel):
14
- nation_wallet_address: Optional[str] = Field(
13
+ nation_wallet_address: str | None = Field(
15
14
  default=None, description="Nation wallet address"
16
15
  )
17
16
 
@@ -19,9 +18,9 @@ class NftCheckInput(BaseModel):
19
18
  class NftCheck(NationBaseTool):
20
19
  name: str = "nft_check"
21
20
  description: str = "Check user nation pass NFTs stats in nation, including usage status and linked agents.By default, it will use the user_id as the wallet address. If you want to check other wallet address, please pass the nation_wallet_address parameter."
22
- args_schema: Type[BaseModel] = NftCheckInput
21
+ args_schema: type[BaseModel] = NftCheckInput
23
22
 
24
- async def _arun(self, nation_wallet_address: Optional[str] = None) -> str:
23
+ async def _arun(self, nation_wallet_address: str | None = None) -> str:
25
24
  """Implementation of the NFT Check tool.
26
25
 
27
26
  Args:
@@ -5,8 +5,9 @@
5
5
  "description": "Check nation NFT stats",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/nation/nation.png",
7
7
  "x-tags": [
8
- "Nation",
9
- "NFTChecker"
8
+ "Analytics",
9
+ "Crypto",
10
+ "NFT"
10
11
  ],
11
12
  "properties": {
12
13
  "enabled": {
@@ -55,4 +56,4 @@
55
56
  "enabled"
56
57
  ],
57
58
  "additionalProperties": true
58
- }
59
+ }
@@ -0,0 +1,23 @@
1
+ from cdp import EvmServerAccount
2
+ from web3 import Web3
3
+
4
+ from intentkit.clients import get_evm_account as fetch_evm_account
5
+ from intentkit.clients.web3 import get_web3_client
6
+ from intentkit.skills.base import IntentKitSkill
7
+
8
+
9
+ class IntentKitOnChainSkill(IntentKitSkill):
10
+ """Shared helpers for on-chain enabled skills."""
11
+
12
+ def web3_client(self) -> Web3:
13
+ """Get a Web3 client for the active agent network."""
14
+ context = self.get_context()
15
+ agent = context.agent
16
+ network_id = agent.network_id
17
+ return get_web3_client(network_id)
18
+
19
+ async def get_evm_account(self) -> EvmServerAccount:
20
+ """Fetch the EVM account associated with the active agent."""
21
+ context = self.get_context()
22
+ agent = context.agent
23
+ return await fetch_evm_account(agent)