intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__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.
Files changed (393) hide show
  1. intentkit/MANIFEST.in +14 -0
  2. intentkit/README.md +88 -0
  3. intentkit/__init__.py +6 -4
  4. intentkit/abstracts/agent.py +4 -5
  5. intentkit/abstracts/engine.py +5 -5
  6. intentkit/abstracts/graph.py +15 -8
  7. intentkit/abstracts/skill.py +6 -144
  8. intentkit/abstracts/twitter.py +4 -5
  9. intentkit/clients/__init__.py +9 -2
  10. intentkit/clients/cdp.py +129 -153
  11. intentkit/{utils → clients}/s3.py +109 -34
  12. intentkit/clients/twitter.py +83 -62
  13. intentkit/clients/web3.py +4 -7
  14. intentkit/config/config.py +123 -90
  15. intentkit/core/account_checking.py +802 -0
  16. intentkit/core/agent.py +313 -498
  17. intentkit/core/asset.py +267 -0
  18. intentkit/core/chat.py +5 -3
  19. intentkit/core/client.py +1 -1
  20. intentkit/core/credit.py +49 -41
  21. intentkit/core/draft.py +201 -0
  22. intentkit/core/draft_chat.py +118 -0
  23. intentkit/core/engine.py +378 -287
  24. intentkit/core/manager/__init__.py +25 -0
  25. intentkit/core/manager/engine.py +220 -0
  26. intentkit/core/manager/service.py +172 -0
  27. intentkit/core/manager/skills.py +178 -0
  28. intentkit/core/middleware.py +231 -0
  29. intentkit/core/prompt.py +74 -114
  30. intentkit/core/scheduler.py +143 -0
  31. intentkit/core/statistics.py +168 -0
  32. intentkit/models/agent.py +931 -518
  33. intentkit/models/agent_data.py +165 -106
  34. intentkit/models/agent_schema.json +38 -251
  35. intentkit/models/app_setting.py +15 -13
  36. intentkit/models/chat.py +86 -140
  37. intentkit/models/credit.py +182 -162
  38. intentkit/models/db.py +42 -23
  39. intentkit/models/db_mig.py +120 -3
  40. intentkit/models/draft.py +222 -0
  41. intentkit/models/llm.csv +31 -0
  42. intentkit/models/llm.py +262 -370
  43. intentkit/models/redis.py +6 -4
  44. intentkit/models/skill.py +222 -101
  45. intentkit/models/skills.csv +173 -0
  46. intentkit/models/team.py +189 -0
  47. intentkit/models/user.py +103 -31
  48. intentkit/skills/acolyt/__init__.py +2 -9
  49. intentkit/skills/acolyt/ask.py +3 -4
  50. intentkit/skills/acolyt/base.py +4 -9
  51. intentkit/skills/acolyt/schema.json +4 -3
  52. intentkit/skills/aixbt/__init__.py +2 -13
  53. intentkit/skills/aixbt/base.py +1 -7
  54. intentkit/skills/aixbt/projects.py +14 -15
  55. intentkit/skills/aixbt/schema.json +4 -4
  56. intentkit/skills/allora/__init__.py +2 -9
  57. intentkit/skills/allora/base.py +4 -9
  58. intentkit/skills/allora/price.py +3 -4
  59. intentkit/skills/allora/schema.json +3 -2
  60. intentkit/skills/base.py +241 -41
  61. intentkit/skills/basename/__init__.py +51 -0
  62. intentkit/skills/basename/base.py +11 -0
  63. intentkit/skills/basename/basename.svg +11 -0
  64. intentkit/skills/basename/schema.json +58 -0
  65. intentkit/skills/carv/__init__.py +115 -121
  66. intentkit/skills/carv/base.py +184 -185
  67. intentkit/skills/carv/fetch_news.py +3 -3
  68. intentkit/skills/carv/onchain_query.py +4 -4
  69. intentkit/skills/carv/schema.json +134 -137
  70. intentkit/skills/carv/token_info_and_price.py +6 -6
  71. intentkit/skills/casino/__init__.py +4 -15
  72. intentkit/skills/casino/base.py +1 -7
  73. intentkit/skills/casino/deck_draw.py +5 -8
  74. intentkit/skills/casino/deck_shuffle.py +6 -6
  75. intentkit/skills/casino/dice_roll.py +2 -4
  76. intentkit/skills/casino/schema.json +0 -1
  77. intentkit/skills/cdp/__init__.py +22 -84
  78. intentkit/skills/cdp/base.py +1 -7
  79. intentkit/skills/cdp/schema.json +11 -314
  80. intentkit/skills/chainlist/__init__.py +2 -7
  81. intentkit/skills/chainlist/base.py +1 -7
  82. intentkit/skills/chainlist/chain_lookup.py +18 -18
  83. intentkit/skills/chainlist/schema.json +3 -5
  84. intentkit/skills/common/__init__.py +2 -9
  85. intentkit/skills/common/base.py +1 -7
  86. intentkit/skills/common/current_time.py +1 -2
  87. intentkit/skills/common/schema.json +2 -2
  88. intentkit/skills/cookiefun/__init__.py +6 -9
  89. intentkit/skills/cookiefun/base.py +2 -7
  90. intentkit/skills/cookiefun/get_account_details.py +7 -7
  91. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  92. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  93. intentkit/skills/cookiefun/get_sectors.py +3 -3
  94. intentkit/skills/cookiefun/schema.json +1 -3
  95. intentkit/skills/cookiefun/search_accounts.py +9 -9
  96. intentkit/skills/cryptocompare/__init__.py +7 -24
  97. intentkit/skills/cryptocompare/api.py +2 -3
  98. intentkit/skills/cryptocompare/base.py +10 -24
  99. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  100. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  101. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  102. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  103. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  104. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  105. intentkit/skills/cryptocompare/schema.json +3 -3
  106. intentkit/skills/cryptopanic/__init__.py +7 -10
  107. intentkit/skills/cryptopanic/base.py +51 -55
  108. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  109. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  110. intentkit/skills/cryptopanic/schema.json +105 -103
  111. intentkit/skills/dapplooker/__init__.py +2 -9
  112. intentkit/skills/dapplooker/base.py +4 -9
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  114. intentkit/skills/dapplooker/schema.json +3 -5
  115. intentkit/skills/defillama/__init__.py +24 -74
  116. intentkit/skills/defillama/api.py +6 -9
  117. intentkit/skills/defillama/base.py +8 -19
  118. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  119. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  120. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  121. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  122. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  123. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  124. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  125. intentkit/skills/defillama/config/chains.py +1 -3
  126. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  127. intentkit/skills/defillama/schema.json +5 -1
  128. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  129. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  130. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  131. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  132. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  133. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  134. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  135. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  136. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  137. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  138. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  139. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  140. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  141. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  142. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  143. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  144. intentkit/skills/dexscreener/__init__.py +97 -102
  145. intentkit/skills/dexscreener/base.py +125 -130
  146. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  147. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  148. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  149. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  150. intentkit/skills/dexscreener/schema.json +91 -93
  151. intentkit/skills/dexscreener/search_token.py +182 -184
  152. intentkit/skills/dexscreener/utils.py +15 -14
  153. intentkit/skills/dune_analytics/__init__.py +7 -9
  154. intentkit/skills/dune_analytics/base.py +48 -52
  155. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  156. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  157. intentkit/skills/dune_analytics/schema.json +104 -99
  158. intentkit/skills/elfa/__init__.py +5 -18
  159. intentkit/skills/elfa/base.py +10 -14
  160. intentkit/skills/elfa/mention.py +19 -21
  161. intentkit/skills/elfa/schema.json +3 -2
  162. intentkit/skills/elfa/stats.py +4 -4
  163. intentkit/skills/elfa/tokens.py +12 -12
  164. intentkit/skills/elfa/utils.py +26 -28
  165. intentkit/skills/enso/__init__.py +11 -31
  166. intentkit/skills/enso/base.py +54 -35
  167. intentkit/skills/enso/best_yield.py +16 -24
  168. intentkit/skills/enso/networks.py +6 -11
  169. intentkit/skills/enso/prices.py +11 -13
  170. intentkit/skills/enso/route.py +34 -38
  171. intentkit/skills/enso/schema.json +3 -2
  172. intentkit/skills/enso/tokens.py +29 -38
  173. intentkit/skills/enso/wallet.py +76 -191
  174. intentkit/skills/erc20/__init__.py +50 -0
  175. intentkit/skills/erc20/base.py +11 -0
  176. intentkit/skills/erc20/erc20.svg +5 -0
  177. intentkit/skills/erc20/schema.json +74 -0
  178. intentkit/skills/erc721/__init__.py +53 -0
  179. intentkit/skills/erc721/base.py +11 -0
  180. intentkit/skills/erc721/erc721.svg +5 -0
  181. intentkit/skills/erc721/schema.json +90 -0
  182. intentkit/skills/firecrawl/__init__.py +5 -18
  183. intentkit/skills/firecrawl/base.py +4 -9
  184. intentkit/skills/firecrawl/clear.py +4 -8
  185. intentkit/skills/firecrawl/crawl.py +19 -19
  186. intentkit/skills/firecrawl/query.py +4 -3
  187. intentkit/skills/firecrawl/schema.json +2 -6
  188. intentkit/skills/firecrawl/scrape.py +17 -22
  189. intentkit/skills/firecrawl/utils.py +50 -42
  190. intentkit/skills/github/__init__.py +2 -7
  191. intentkit/skills/github/base.py +1 -7
  192. intentkit/skills/github/github_search.py +1 -2
  193. intentkit/skills/github/schema.json +3 -4
  194. intentkit/skills/heurist/__init__.py +8 -27
  195. intentkit/skills/heurist/base.py +4 -9
  196. intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
  197. intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
  198. intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
  199. intentkit/skills/heurist/image_generation_braindance.py +13 -15
  200. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
  201. intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
  202. intentkit/skills/heurist/image_generation_sdxl.py +13 -15
  203. intentkit/skills/heurist/schema.json +2 -2
  204. intentkit/skills/http/__init__.py +4 -15
  205. intentkit/skills/http/base.py +1 -7
  206. intentkit/skills/http/get.py +21 -16
  207. intentkit/skills/http/post.py +23 -18
  208. intentkit/skills/http/put.py +23 -18
  209. intentkit/skills/http/schema.json +4 -5
  210. intentkit/skills/lifi/__init__.py +8 -13
  211. intentkit/skills/lifi/base.py +3 -9
  212. intentkit/skills/lifi/schema.json +17 -8
  213. intentkit/skills/lifi/token_execute.py +150 -60
  214. intentkit/skills/lifi/token_quote.py +8 -10
  215. intentkit/skills/lifi/utils.py +104 -51
  216. intentkit/skills/moralis/__init__.py +6 -10
  217. intentkit/skills/moralis/api.py +6 -7
  218. intentkit/skills/moralis/base.py +5 -10
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  223. intentkit/skills/moralis/schema.json +7 -2
  224. intentkit/skills/morpho/__init__.py +52 -0
  225. intentkit/skills/morpho/base.py +11 -0
  226. intentkit/skills/morpho/morpho.svg +12 -0
  227. intentkit/skills/morpho/schema.json +73 -0
  228. intentkit/skills/nation/__init__.py +4 -9
  229. intentkit/skills/nation/base.py +5 -10
  230. intentkit/skills/nation/nft_check.py +3 -4
  231. intentkit/skills/nation/schema.json +4 -3
  232. intentkit/skills/onchain.py +30 -0
  233. intentkit/skills/openai/__init__.py +17 -18
  234. intentkit/skills/openai/base.py +10 -14
  235. intentkit/skills/openai/dalle_image_generation.py +4 -9
  236. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  237. intentkit/skills/openai/gpt_image_generation.py +5 -9
  238. intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
  239. intentkit/skills/openai/gpt_image_to_image.py +5 -9
  240. intentkit/skills/openai/image_to_text.py +3 -7
  241. intentkit/skills/openai/schema.json +34 -3
  242. intentkit/skills/portfolio/__init__.py +11 -35
  243. intentkit/skills/portfolio/base.py +33 -19
  244. intentkit/skills/portfolio/schema.json +3 -5
  245. intentkit/skills/portfolio/token_balances.py +21 -21
  246. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  247. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  248. intentkit/skills/portfolio/wallet_history.py +31 -31
  249. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  250. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  251. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  252. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  253. intentkit/skills/portfolio/wallet_stats.py +3 -3
  254. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  255. intentkit/skills/pyth/__init__.py +50 -0
  256. intentkit/skills/pyth/base.py +11 -0
  257. intentkit/skills/pyth/pyth.svg +6 -0
  258. intentkit/skills/pyth/schema.json +75 -0
  259. intentkit/skills/skills.toml +36 -0
  260. intentkit/skills/slack/__init__.py +5 -17
  261. intentkit/skills/slack/base.py +3 -9
  262. intentkit/skills/slack/get_channel.py +8 -8
  263. intentkit/skills/slack/get_message.py +9 -9
  264. intentkit/skills/slack/schedule_message.py +5 -5
  265. intentkit/skills/slack/schema.json +2 -2
  266. intentkit/skills/slack/send_message.py +3 -5
  267. intentkit/skills/supabase/__init__.py +7 -23
  268. intentkit/skills/supabase/base.py +1 -7
  269. intentkit/skills/supabase/delete_data.py +4 -4
  270. intentkit/skills/supabase/fetch_data.py +12 -12
  271. intentkit/skills/supabase/insert_data.py +4 -4
  272. intentkit/skills/supabase/invoke_function.py +6 -6
  273. intentkit/skills/supabase/schema.json +2 -3
  274. intentkit/skills/supabase/update_data.py +6 -6
  275. intentkit/skills/supabase/upsert_data.py +4 -4
  276. intentkit/skills/superfluid/__init__.py +53 -0
  277. intentkit/skills/superfluid/base.py +11 -0
  278. intentkit/skills/superfluid/schema.json +89 -0
  279. intentkit/skills/superfluid/superfluid.svg +6 -0
  280. intentkit/skills/system/__init__.py +7 -24
  281. intentkit/skills/system/add_autonomous_task.py +10 -12
  282. intentkit/skills/system/delete_autonomous_task.py +2 -2
  283. intentkit/skills/system/edit_autonomous_task.py +14 -18
  284. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  285. intentkit/skills/system/read_agent_api_key.py +6 -4
  286. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  287. intentkit/skills/system/schema.json +6 -8
  288. intentkit/skills/tavily/__init__.py +3 -12
  289. intentkit/skills/tavily/base.py +4 -9
  290. intentkit/skills/tavily/schema.json +3 -5
  291. intentkit/skills/tavily/tavily_extract.py +2 -4
  292. intentkit/skills/tavily/tavily_search.py +4 -6
  293. intentkit/skills/token/__init__.py +5 -10
  294. intentkit/skills/token/base.py +7 -11
  295. intentkit/skills/token/erc20_transfers.py +19 -19
  296. intentkit/skills/token/schema.json +3 -6
  297. intentkit/skills/token/token_analytics.py +3 -3
  298. intentkit/skills/token/token_price.py +13 -13
  299. intentkit/skills/token/token_search.py +9 -9
  300. intentkit/skills/twitter/__init__.py +11 -35
  301. intentkit/skills/twitter/base.py +22 -34
  302. intentkit/skills/twitter/follow_user.py +2 -6
  303. intentkit/skills/twitter/get_mentions.py +5 -12
  304. intentkit/skills/twitter/get_timeline.py +4 -12
  305. intentkit/skills/twitter/get_user_by_username.py +2 -6
  306. intentkit/skills/twitter/get_user_tweets.py +5 -13
  307. intentkit/skills/twitter/like_tweet.py +2 -6
  308. intentkit/skills/twitter/post_tweet.py +6 -9
  309. intentkit/skills/twitter/reply_tweet.py +6 -9
  310. intentkit/skills/twitter/retweet.py +2 -6
  311. intentkit/skills/twitter/schema.json +1 -0
  312. intentkit/skills/twitter/search_tweets.py +4 -12
  313. intentkit/skills/unrealspeech/__init__.py +2 -7
  314. intentkit/skills/unrealspeech/base.py +2 -8
  315. intentkit/skills/unrealspeech/schema.json +2 -5
  316. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  317. intentkit/skills/venice_audio/__init__.py +98 -106
  318. intentkit/skills/venice_audio/base.py +117 -121
  319. intentkit/skills/venice_audio/input.py +41 -41
  320. intentkit/skills/venice_audio/schema.json +151 -152
  321. intentkit/skills/venice_audio/venice_audio.py +38 -21
  322. intentkit/skills/venice_image/__init__.py +147 -154
  323. intentkit/skills/venice_image/api.py +138 -138
  324. intentkit/skills/venice_image/base.py +185 -192
  325. intentkit/skills/venice_image/config.py +33 -35
  326. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  327. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  328. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  329. intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
  330. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  332. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  333. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  334. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  335. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  336. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  337. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  338. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  339. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  340. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  341. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  344. intentkit/skills/venice_image/schema.json +267 -267
  345. intentkit/skills/venice_image/utils.py +77 -78
  346. intentkit/skills/web_scraper/__init__.py +5 -18
  347. intentkit/skills/web_scraper/base.py +21 -7
  348. intentkit/skills/web_scraper/document_indexer.py +7 -6
  349. intentkit/skills/web_scraper/schema.json +2 -6
  350. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  351. intentkit/skills/web_scraper/utils.py +62 -63
  352. intentkit/skills/web_scraper/website_indexer.py +17 -19
  353. intentkit/skills/weth/__init__.py +49 -0
  354. intentkit/skills/weth/base.py +11 -0
  355. intentkit/skills/weth/schema.json +58 -0
  356. intentkit/skills/weth/weth.svg +6 -0
  357. intentkit/skills/wow/__init__.py +51 -0
  358. intentkit/skills/wow/base.py +11 -0
  359. intentkit/skills/wow/schema.json +89 -0
  360. intentkit/skills/wow/wow.svg +7 -0
  361. intentkit/skills/x402/__init__.py +58 -0
  362. intentkit/skills/x402/base.py +99 -0
  363. intentkit/skills/x402/http_request.py +117 -0
  364. intentkit/skills/x402/schema.json +40 -0
  365. intentkit/skills/x402/x402.webp +0 -0
  366. intentkit/skills/xmtp/__init__.py +4 -15
  367. intentkit/skills/xmtp/base.py +5 -5
  368. intentkit/skills/xmtp/price.py +7 -6
  369. intentkit/skills/xmtp/schema.json +69 -71
  370. intentkit/skills/xmtp/swap.py +6 -8
  371. intentkit/skills/xmtp/transfer.py +4 -6
  372. intentkit/utils/__init__.py +4 -0
  373. intentkit/utils/chain.py +198 -96
  374. intentkit/utils/ens.py +135 -0
  375. intentkit/utils/error.py +5 -2
  376. intentkit/utils/logging.py +9 -11
  377. intentkit/utils/schema.py +100 -0
  378. intentkit/utils/slack_alert.py +8 -8
  379. intentkit/utils/tx.py +16 -8
  380. intentkit/uv.lock +3377 -0
  381. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
  382. intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
  383. intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
  384. intentkit/core/node.py +0 -215
  385. intentkit/models/conversation.py +0 -286
  386. intentkit/models/generator.py +0 -347
  387. intentkit/skills/cdp/get_balance.py +0 -110
  388. intentkit/skills/cdp/swap.py +0 -121
  389. intentkit/skills/moralis/tests/__init__.py +0 -0
  390. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  391. intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
  392. {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
  393. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
@@ -1,12 +1,10 @@
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
 
8
7
  from intentkit.abstracts.graph import AgentContext
9
- from intentkit.abstracts.skill import SkillStoreABC
10
8
  from intentkit.skills.base import IntentKitSkill
11
9
  from intentkit.skills.defillama.config.chains import (
12
10
  get_chain_from_alias,
@@ -27,10 +25,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
27
25
 
28
26
  name: str = Field(description="The name of the tool")
29
27
  description: str = Field(description="A description of what the tool does")
30
- args_schema: Type[BaseModel]
31
- skill_store: SkillStoreABC = Field(
32
- description="The skill store for persisting data"
33
- )
28
+ args_schema: type[BaseModel]
34
29
  base_url: str = Field(
35
30
  default=DEFILLAMA_BASE_URL, description="Base URL for DeFi Llama API"
36
31
  )
@@ -52,10 +47,8 @@ class DefiLlamaBaseTool(IntentKitSkill):
52
47
  Returns:
53
48
  Rate limit status and error message if limited
54
49
  """
55
- rate_limit = await self.skill_store.get_agent_skill_data(
56
- context.agent_id, self.name, "rate_limit"
57
- )
58
- current_time = datetime.now(tz=timezone.utc)
50
+ rate_limit = await self.get_agent_skill_data("rate_limit")
51
+ current_time = datetime.now(tz=UTC)
59
52
 
60
53
  if (
61
54
  rate_limit
@@ -67,18 +60,14 @@ class DefiLlamaBaseTool(IntentKitSkill):
67
60
  return True, "Rate limit exceeded"
68
61
 
69
62
  rate_limit["count"] += 1
70
- await self.skill_store.save_agent_skill_data(
71
- context.agent_id, self.name, "rate_limit", rate_limit
72
- )
63
+ await self.save_agent_skill_data("rate_limit", rate_limit)
73
64
  return False, None
74
65
 
75
66
  new_rate_limit = {
76
67
  "count": 1,
77
68
  "reset_time": (current_time + timedelta(minutes=interval)).isoformat(),
78
69
  }
79
- await self.skill_store.save_agent_skill_data(
80
- context.agent_id, self.name, "rate_limit", new_rate_limit
81
- )
70
+ await self.save_agent_skill_data("rate_limit", new_rate_limit)
82
71
  return False, None
83
72
 
84
73
  async def validate_chain(self, chain: str | None) -> tuple[bool, str | None]:
@@ -124,7 +113,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
124
113
  "error": True,
125
114
  "status_code": status_code,
126
115
  "message": message,
127
- "timestamp": datetime.now(tz=timezone.utc).isoformat(),
116
+ "timestamp": datetime.now(tz=UTC).isoformat(),
128
117
  }
129
118
 
130
119
  def get_current_timestamp(self) -> int:
@@ -133,4 +122,4 @@ class DefiLlamaBaseTool(IntentKitSkill):
133
122
  Returns:
134
123
  Current Unix timestamp
135
124
  """
136
- return int(datetime.now(tz=timezone.utc).timestamp())
125
+ return int(datetime.now(tz=UTC).timestamp())
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching batch historical token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_batch_historical_prices
@@ -33,7 +31,7 @@ class TokenPriceHistory(BaseModel):
33
31
  """Model representing historical price data for a single token."""
34
32
 
35
33
  symbol: str = Field(..., description="Token symbol")
36
- prices: List[HistoricalPricePoint] = Field(
34
+ prices: list[HistoricalPricePoint] = Field(
37
35
  ..., description="List of historical price points"
38
36
  )
39
37
 
@@ -41,7 +39,7 @@ class TokenPriceHistory(BaseModel):
41
39
  class FetchBatchHistoricalPricesInput(BaseModel):
42
40
  """Input schema for fetching batch historical token prices."""
43
41
 
44
- coins_timestamps: Dict[str, List[int]] = Field(
42
+ coins_timestamps: dict[str, list[int]] = Field(
45
43
  ..., description="Dictionary mapping token identifiers to lists of timestamps"
46
44
  )
47
45
 
@@ -49,11 +47,11 @@ class FetchBatchHistoricalPricesInput(BaseModel):
49
47
  class FetchBatchHistoricalPricesResponse(BaseModel):
50
48
  """Response schema for batch historical token prices."""
51
49
 
52
- coins: Dict[str, TokenPriceHistory] = Field(
50
+ coins: dict[str, TokenPriceHistory] = Field(
53
51
  default_factory=dict,
54
52
  description="Historical token prices keyed by token identifier",
55
53
  )
56
- error: Optional[str] = Field(None, description="Error message if any")
54
+ error: str | None = Field(None, description="Error message if any")
57
55
 
58
56
 
59
57
  class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
@@ -64,9 +62,9 @@ class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
64
62
 
65
63
  Example:
66
64
  prices_tool = DefiLlamaFetchBatchHistoricalPrices(
67
- skill_store=store,
65
+ ,
68
66
  agent_id="agent_123",
69
- agent_store=agent_store
67
+ agent=agent
70
68
  )
71
69
  result = await prices_tool._arun(
72
70
  coins_timestamps={
@@ -78,10 +76,10 @@ class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
78
76
 
79
77
  name: str = "defillama_fetch_batch_historical_prices"
80
78
  description: str = FETCH_BATCH_HISTORICAL_PRICES_PROMPT
81
- args_schema: Type[BaseModel] = FetchBatchHistoricalPricesInput
79
+ args_schema: type[BaseModel] = FetchBatchHistoricalPricesInput
82
80
 
83
81
  async def _arun(
84
- self, coins_timestamps: Dict[str, List[int]]
82
+ self, coins_timestamps: dict[str, list[int]]
85
83
  ) -> FetchBatchHistoricalPricesResponse:
86
84
  """Fetch historical prices for the given tokens at specified timestamps.
87
85
 
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching current block data via DeFi Llama API."""
2
2
 
3
- from typing import Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_block
@@ -34,9 +32,9 @@ class FetchBlockResponse(BaseModel):
34
32
  """Response schema for block data."""
35
33
 
36
34
  chain: str = Field(..., description="Normalized chain name")
37
- height: Optional[int] = Field(None, description="Block height number")
38
- timestamp: Optional[int] = Field(None, description="Unix timestamp of the block")
39
- error: Optional[str] = Field(None, description="Error message if any")
35
+ height: int | None = Field(None, description="Block height number")
36
+ timestamp: int | None = Field(None, description="Unix timestamp of the block")
37
+ error: str | None = Field(None, description="Error message if any")
40
38
 
41
39
 
42
40
  class DefiLlamaFetchBlock(DefiLlamaBaseTool):
@@ -46,16 +44,16 @@ class DefiLlamaFetchBlock(DefiLlamaBaseTool):
46
44
 
47
45
  Example:
48
46
  block_tool = DefiLlamaFetchBlock(
49
- skill_store=store,
47
+ ,
50
48
  agent_id="agent_123",
51
- agent_store=agent_store
49
+ agent=agent
52
50
  )
53
51
  result = await block_tool._arun(chain="ethereum")
54
52
  """
55
53
 
56
54
  name: str = "defillama_fetch_block"
57
55
  description: str = FETCH_BLOCK_PROMPT
58
- args_schema: Type[BaseModel] = FetchBlockInput
56
+ args_schema: type[BaseModel] = FetchBlockInput
59
57
 
60
58
  async def _arun(self, chain: str) -> FetchBlockResponse:
61
59
  """Fetch current block data for the given chain.
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_current_prices
@@ -29,13 +27,13 @@ class TokenPrice(BaseModel):
29
27
  symbol: str = Field(..., description="Token symbol")
30
28
  timestamp: int = Field(..., description="Unix timestamp of last price update")
31
29
  confidence: float = Field(..., description="Confidence score for the price data")
32
- decimals: Optional[int] = Field(None, description="Token decimals, if available")
30
+ decimals: int | None = Field(None, description="Token decimals, if available")
33
31
 
34
32
 
35
33
  class FetchCurrentPricesInput(BaseModel):
36
34
  """Input schema for fetching current token prices with a 4-hour search window."""
37
35
 
38
- coins: List[str] = Field(
36
+ coins: list[str] = Field(
39
37
  ...,
40
38
  description="List of token identifiers (e.g. 'ethereum:0x...', 'coingecko:ethereum')",
41
39
  )
@@ -44,10 +42,10 @@ class FetchCurrentPricesInput(BaseModel):
44
42
  class FetchCurrentPricesResponse(BaseModel):
45
43
  """Response schema for current token prices."""
46
44
 
47
- coins: Dict[str, TokenPrice] = Field(
45
+ coins: dict[str, TokenPrice] = Field(
48
46
  default_factory=dict, description="Token prices keyed by token identifier"
49
47
  )
50
- error: Optional[str] = Field(None, description="Error message if any")
48
+ error: str | None = Field(None, description="Error message if any")
51
49
 
52
50
 
53
51
  class DefiLlamaFetchCurrentPrices(DefiLlamaBaseTool):
@@ -58,9 +56,9 @@ class DefiLlamaFetchCurrentPrices(DefiLlamaBaseTool):
58
56
 
59
57
  Example:
60
58
  prices_tool = DefiLlamaFetchCurrentPrices(
61
- skill_store=store,
59
+ ,
62
60
  agent_id="agent_123",
63
- agent_store=agent_store
61
+ agent=agent
64
62
  )
65
63
  result = await prices_tool._arun(
66
64
  coins=["ethereum:0x...", "coingecko:bitcoin"]
@@ -69,9 +67,9 @@ class DefiLlamaFetchCurrentPrices(DefiLlamaBaseTool):
69
67
 
70
68
  name: str = "defillama_fetch_current_prices"
71
69
  description: str = FETCH_PRICES_PROMPT
72
- args_schema: Type[BaseModel] = FetchCurrentPricesInput
70
+ args_schema: type[BaseModel] = FetchCurrentPricesInput
73
71
 
74
- async def _arun(self, coins: List[str]) -> FetchCurrentPricesResponse:
72
+ async def _arun(self, coins: list[str]) -> FetchCurrentPricesResponse:
75
73
  """Fetch current prices for the given tokens.
76
74
 
77
75
  Args:
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching first recorded token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_first_price
@@ -31,7 +29,7 @@ class FirstPriceData(BaseModel):
31
29
  class FetchFirstPriceInput(BaseModel):
32
30
  """Input schema for fetching first token prices."""
33
31
 
34
- coins: List[str] = Field(
32
+ coins: list[str] = Field(
35
33
  ..., description="List of token identifiers to fetch first prices for"
36
34
  )
37
35
 
@@ -39,10 +37,10 @@ class FetchFirstPriceInput(BaseModel):
39
37
  class FetchFirstPriceResponse(BaseModel):
40
38
  """Response schema for first token prices."""
41
39
 
42
- coins: Dict[str, FirstPriceData] = Field(
40
+ coins: dict[str, FirstPriceData] = Field(
43
41
  default_factory=dict, description="First price data keyed by token identifier"
44
42
  )
45
- error: Optional[str] = Field(None, description="Error message if any")
43
+ error: str | None = Field(None, description="Error message if any")
46
44
 
47
45
 
48
46
  class DefiLlamaFetchFirstPrice(DefiLlamaBaseTool):
@@ -53,9 +51,9 @@ class DefiLlamaFetchFirstPrice(DefiLlamaBaseTool):
53
51
 
54
52
  Example:
55
53
  first_price_tool = DefiLlamaFetchFirstPrice(
56
- skill_store=store,
54
+ ,
57
55
  agent_id="agent_123",
58
- agent_store=agent_store
56
+ agent=agent
59
57
  )
60
58
  result = await first_price_tool._arun(
61
59
  coins=["ethereum:0x...", "coingecko:ethereum"]
@@ -64,9 +62,9 @@ class DefiLlamaFetchFirstPrice(DefiLlamaBaseTool):
64
62
 
65
63
  name: str = "defillama_fetch_first_price"
66
64
  description: str = FETCH_FIRST_PRICE_PROMPT
67
- args_schema: Type[BaseModel] = FetchFirstPriceInput
65
+ args_schema: type[BaseModel] = FetchFirstPriceInput
68
66
 
69
- async def _arun(self, coins: List[str]) -> FetchFirstPriceResponse:
67
+ async def _arun(self, coins: list[str]) -> FetchFirstPriceResponse:
70
68
  """Fetch first recorded prices for the given tokens.
71
69
 
72
70
  Args:
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching historical token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_historical_prices
@@ -26,9 +24,9 @@ class HistoricalTokenPrice(BaseModel):
26
24
  """Model representing historical token price data."""
27
25
 
28
26
  price: float = Field(..., description="Token price in USD at the specified time")
29
- symbol: Optional[str] = Field(None, description="Token symbol")
27
+ symbol: str | None = Field(None, description="Token symbol")
30
28
  timestamp: int = Field(..., description="Unix timestamp of the price data")
31
- decimals: Optional[int] = Field(None, description="Token decimals, if available")
29
+ decimals: int | None = Field(None, description="Token decimals, if available")
32
30
 
33
31
 
34
32
  class FetchHistoricalPricesInput(BaseModel):
@@ -37,7 +35,7 @@ class FetchHistoricalPricesInput(BaseModel):
37
35
  timestamp: int = Field(
38
36
  ..., description="Unix timestamp for historical price lookup"
39
37
  )
40
- coins: List[str] = Field(
38
+ coins: list[str] = Field(
41
39
  ...,
42
40
  description="List of token identifiers (e.g. 'ethereum:0x...', 'coingecko:ethereum')",
43
41
  )
@@ -46,11 +44,11 @@ class FetchHistoricalPricesInput(BaseModel):
46
44
  class FetchHistoricalPricesResponse(BaseModel):
47
45
  """Response schema for historical token prices."""
48
46
 
49
- coins: Dict[str, HistoricalTokenPrice] = Field(
47
+ coins: dict[str, HistoricalTokenPrice] = Field(
50
48
  default_factory=dict,
51
49
  description="Historical token prices keyed by token identifier",
52
50
  )
53
- error: Optional[str] = Field(None, description="Error message if any")
51
+ error: str | None = Field(None, description="Error message if any")
54
52
 
55
53
 
56
54
  class DefiLlamaFetchHistoricalPrices(DefiLlamaBaseTool):
@@ -61,9 +59,9 @@ class DefiLlamaFetchHistoricalPrices(DefiLlamaBaseTool):
61
59
 
62
60
  Example:
63
61
  prices_tool = DefiLlamaFetchHistoricalPrices(
64
- skill_store=store,
62
+ ,
65
63
  agent_id="agent_123",
66
- agent_store=agent_store
64
+ agent=agent
67
65
  )
68
66
  result = await prices_tool._arun(
69
67
  timestamp=1640995200, # Jan 1, 2022
@@ -73,10 +71,10 @@ class DefiLlamaFetchHistoricalPrices(DefiLlamaBaseTool):
73
71
 
74
72
  name: str = "defillama_fetch_historical_prices"
75
73
  description: str = FETCH_HISTORICAL_PRICES_PROMPT
76
- args_schema: Type[BaseModel] = FetchHistoricalPricesInput
74
+ args_schema: type[BaseModel] = FetchHistoricalPricesInput
77
75
 
78
76
  async def _arun(
79
- self, timestamp: int, coins: List[str]
77
+ self, timestamp: int, coins: list[str]
80
78
  ) -> FetchHistoricalPricesResponse:
81
79
  """Fetch historical prices for the given tokens at the specified time.
82
80
 
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching token price charts via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_price_chart
@@ -33,14 +31,14 @@ class TokenPriceChart(BaseModel):
33
31
 
34
32
  symbol: str = Field(..., description="Token symbol")
35
33
  confidence: float = Field(..., description="Confidence score for the price data")
36
- decimals: Optional[int] = Field(None, description="Token decimals")
37
- prices: List[PricePoint] = Field(..., description="List of historical price points")
34
+ decimals: int | None = Field(None, description="Token decimals")
35
+ prices: list[PricePoint] = Field(..., description="List of historical price points")
38
36
 
39
37
 
40
38
  class FetchPriceChartInput(BaseModel):
41
39
  """Input schema for fetching token price charts."""
42
40
 
43
- coins: List[str] = Field(
41
+ coins: list[str] = Field(
44
42
  ..., description="List of token identifiers to fetch price charts for"
45
43
  )
46
44
 
@@ -48,10 +46,10 @@ class FetchPriceChartInput(BaseModel):
48
46
  class FetchPriceChartResponse(BaseModel):
49
47
  """Response schema for token price charts."""
50
48
 
51
- coins: Dict[str, TokenPriceChart] = Field(
49
+ coins: dict[str, TokenPriceChart] = Field(
52
50
  default_factory=dict, description="Price chart data keyed by token identifier"
53
51
  )
54
- error: Optional[str] = Field(None, description="Error message if any")
52
+ error: str | None = Field(None, description="Error message if any")
55
53
 
56
54
 
57
55
  class DefiLlamaFetchPriceChart(DefiLlamaBaseTool):
@@ -62,9 +60,9 @@ class DefiLlamaFetchPriceChart(DefiLlamaBaseTool):
62
60
 
63
61
  Example:
64
62
  chart_tool = DefiLlamaFetchPriceChart(
65
- skill_store=store,
63
+ ,
66
64
  agent_id="agent_123",
67
- agent_store=agent_store
65
+ agent=agent
68
66
  )
69
67
  result = await chart_tool._arun(
70
68
  coins=["ethereum:0x...", "coingecko:ethereum"]
@@ -73,9 +71,9 @@ class DefiLlamaFetchPriceChart(DefiLlamaBaseTool):
73
71
 
74
72
  name: str = "defillama_fetch_price_chart"
75
73
  description: str = FETCH_PRICE_CHART_PROMPT
76
- args_schema: Type[BaseModel] = FetchPriceChartInput
74
+ args_schema: type[BaseModel] = FetchPriceChartInput
77
75
 
78
- async def _arun(self, coins: List[str]) -> FetchPriceChartResponse:
76
+ async def _arun(self, coins: list[str]) -> FetchPriceChartResponse:
79
77
  """Fetch price charts for the given tokens.
80
78
 
81
79
  Args:
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching token price percentage changes via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_price_percentage
@@ -23,7 +21,7 @@ Returns price percentage changes:
23
21
  class FetchPricePercentageInput(BaseModel):
24
22
  """Input schema for fetching token price percentage changes."""
25
23
 
26
- coins: List[str] = Field(
24
+ coins: list[str] = Field(
27
25
  ..., description="List of token identifiers to fetch price changes for"
28
26
  )
29
27
 
@@ -31,11 +29,11 @@ class FetchPricePercentageInput(BaseModel):
31
29
  class FetchPricePercentageResponse(BaseModel):
32
30
  """Response schema for token price percentage changes."""
33
31
 
34
- coins: Dict[str, float] = Field(
32
+ coins: dict[str, float] = Field(
35
33
  default_factory=dict,
36
34
  description="Price percentage changes keyed by token identifier",
37
35
  )
38
- error: Optional[str] = Field(None, description="Error message if any")
36
+ error: str | None = Field(None, description="Error message if any")
39
37
 
40
38
 
41
39
  class DefiLlamaFetchPricePercentage(DefiLlamaBaseTool):
@@ -46,9 +44,9 @@ class DefiLlamaFetchPricePercentage(DefiLlamaBaseTool):
46
44
 
47
45
  Example:
48
46
  percentage_tool = DefiLlamaFetchPricePercentage(
49
- skill_store=store,
47
+ ,
50
48
  agent_id="agent_123",
51
- agent_store=agent_store
49
+ agent=agent
52
50
  )
53
51
  result = await percentage_tool._arun(
54
52
  coins=["ethereum:0x...", "coingecko:ethereum"]
@@ -57,9 +55,9 @@ class DefiLlamaFetchPricePercentage(DefiLlamaBaseTool):
57
55
 
58
56
  name: str = "defillama_fetch_price_percentage"
59
57
  description: str = FETCH_PRICE_PERCENTAGE_PROMPT
60
- args_schema: Type[BaseModel] = FetchPricePercentageInput
58
+ args_schema: type[BaseModel] = FetchPricePercentageInput
61
59
 
62
- async def _arun(self, coins: List[str]) -> FetchPricePercentageResponse:
60
+ async def _arun(self, coins: list[str]) -> FetchPricePercentageResponse:
63
61
  """Fetch price percentage changes for the given tokens.
64
62
 
65
63
  Args:
@@ -4,10 +4,8 @@ This module contains the valid chains and their aliases for use with the DeFi Ll
4
4
  The VALID_CHAINS dictionary maps primary chain identifiers to their known aliases.
5
5
  """
6
6
 
7
- from typing import Dict, List
8
-
9
7
  # Chain configuration with aliases
10
- VALID_CHAINS: Dict[str, List[str]] = {
8
+ VALID_CHAINS: dict[str, list[str]] = {
11
9
  "ethereum": ["eth", "eth1", "eth2"],
12
10
  "solana": ["sol"],
13
11
  "bitcoin": ["btc"],
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching fees overview data via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_fees_overview
@@ -20,16 +18,16 @@ Returns detailed metrics including:
20
18
  class ProtocolMethodology(BaseModel):
21
19
  """Model representing protocol methodology data."""
22
20
 
23
- UserFees: Optional[str] = Field(None, description="Description of user fees")
24
- Fees: Optional[str] = Field(None, description="Description of fees")
25
- Revenue: Optional[str] = Field(None, description="Description of revenue")
26
- ProtocolRevenue: Optional[str] = Field(
21
+ UserFees: str | None = Field(None, description="Description of user fees")
22
+ Fees: str | None = Field(None, description="Description of fees")
23
+ Revenue: str | None = Field(None, description="Description of revenue")
24
+ ProtocolRevenue: str | None = Field(
27
25
  None, description="Description of protocol revenue"
28
26
  )
29
- HoldersRevenue: Optional[str] = Field(
27
+ HoldersRevenue: str | None = Field(
30
28
  None, description="Description of holders revenue"
31
29
  )
32
- SupplySideRevenue: Optional[str] = Field(
30
+ SupplySideRevenue: str | None = Field(
33
31
  None, description="Description of supply side revenue"
34
32
  )
35
33
 
@@ -41,23 +39,23 @@ class Protocol(BaseModel):
41
39
  displayName: str = Field(..., description="Display name of protocol")
42
40
  category: str = Field(..., description="Protocol category")
43
41
  logo: str = Field(..., description="Logo URL")
44
- chains: List[str] = Field(..., description="Supported chains")
42
+ chains: list[str] = Field(..., description="Supported chains")
45
43
  module: str = Field(..., description="Protocol module")
46
- total24h: Optional[float] = Field(None, description="24-hour total fees")
47
- total7d: Optional[float] = Field(None, description="7-day total fees")
48
- total30d: Optional[float] = Field(None, description="30-day total fees")
49
- total1y: Optional[float] = Field(None, description="1-year total fees")
50
- totalAllTime: Optional[float] = Field(None, description="All-time total fees")
51
- change_1d: Optional[float] = Field(None, description="24-hour change percentage")
52
- change_7d: Optional[float] = Field(None, description="7-day change percentage")
53
- change_1m: Optional[float] = Field(None, description="30-day change percentage")
54
- methodology: Optional[ProtocolMethodology] = Field(
44
+ total24h: float | None = Field(None, description="24-hour total fees")
45
+ total7d: float | None = Field(None, description="7-day total fees")
46
+ total30d: float | None = Field(None, description="30-day total fees")
47
+ total1y: float | None = Field(None, description="1-year total fees")
48
+ totalAllTime: float | None = Field(None, description="All-time total fees")
49
+ change_1d: float | None = Field(None, description="24-hour change percentage")
50
+ change_7d: float | None = Field(None, description="7-day change percentage")
51
+ change_1m: float | None = Field(None, description="30-day change percentage")
52
+ methodology: ProtocolMethodology | None = Field(
55
53
  None, description="Protocol methodology"
56
54
  )
57
- breakdown24h: Optional[Dict[str, Dict[str, float]]] = Field(
55
+ breakdown24h: dict[str, dict[str, float]] | None = Field(
58
56
  None, description="24-hour breakdown by chain"
59
57
  )
60
- breakdown30d: Optional[Dict[str, Dict[str, float]]] = Field(
58
+ breakdown30d: dict[str, dict[str, float]] | None = Field(
61
59
  None, description="30-day breakdown by chain"
62
60
  )
63
61
 
@@ -72,9 +70,9 @@ class FetchFeesOverviewResponse(BaseModel):
72
70
  change_1d: float = Field(..., description="24-hour change percentage")
73
71
  change_7d: float = Field(..., description="7-day change percentage")
74
72
  change_1m: float = Field(..., description="30-day change percentage")
75
- allChains: List[str] = Field(..., description="List of all chains")
76
- protocols: List[Protocol] = Field(..., description="List of protocols")
77
- error: Optional[str] = Field(None, description="Error message if any")
73
+ allChains: list[str] = Field(..., description="List of all chains")
74
+ protocols: list[Protocol] = Field(..., description="List of protocols")
75
+ error: str | None = Field(None, description="Error message if any")
78
76
 
79
77
 
80
78
  class DefiLlamaFetchFeesOverview(DefiLlamaBaseTool):
@@ -85,9 +83,9 @@ class DefiLlamaFetchFeesOverview(DefiLlamaBaseTool):
85
83
 
86
84
  Example:
87
85
  overview_tool = DefiLlamaFetchFeesOverview(
88
- skill_store=store,
86
+ ,
89
87
  agent_id="agent_123",
90
- agent_store=agent_store
88
+ agent=agent
91
89
  )
92
90
  result = await overview_tool._arun()
93
91
  """
@@ -100,7 +98,7 @@ class DefiLlamaFetchFeesOverview(DefiLlamaBaseTool):
100
98
 
101
99
  pass
102
100
 
103
- args_schema: Type[BaseModel] = EmptyArgsSchema
101
+ args_schema: type[BaseModel] = EmptyArgsSchema
104
102
 
105
103
  async def _arun(self, **kwargs) -> FetchFeesOverviewResponse:
106
104
  """Fetch overview data for protocol fees.
@@ -379,5 +379,9 @@
379
379
  "required": [
380
380
  "states",
381
381
  "enabled"
382
+ ],
383
+ "x-tags": [
384
+ "Analytics",
385
+ "DeFi"
382
386
  ]
383
- }
387
+ }