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
@@ -3,13 +3,12 @@
3
3
  Uses query ID 4832844 to retrieve a list of KOL buy transactions.
4
4
  """
5
5
 
6
- from typing import Any, Dict, Type
6
+ from typing import Any
7
7
 
8
8
  import httpx
9
9
  from pydantic import BaseModel, Field
10
10
  from tenacity import retry, stop_after_attempt, wait_exponential
11
11
 
12
- from intentkit.abstracts.skill import SkillStoreABC
13
12
  from intentkit.skills.dune_analytics.base import DuneBaseTool
14
13
 
15
14
  BASE_URL = "https://api.dune.com/api/v1/query"
@@ -29,7 +28,7 @@ class KOLBuysInput(BaseModel):
29
28
  class KOLBuyData(BaseModel):
30
29
  """Data model for KOL buy results."""
31
30
 
32
- data: Dict[str, Any] = Field(description="KOL buy data from Dune API")
31
+ data: dict[str, Any] = Field(description="KOL buy data from Dune API")
33
32
  error: str = Field(default="", description="Error message if fetch failed")
34
33
 
35
34
 
@@ -48,15 +47,14 @@ class FetchKOLBuys(DuneBaseTool):
48
47
  "Fetches a list of KOL memecoin buy transactions on Solana from Dune Analytics API using query ID 4832844. "
49
48
  "Supports a configurable limit for the number of results. Handles rate limits with retries."
50
49
  )
51
- args_schema: Type[BaseModel] = KOLBuysInput
52
- skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
50
+ args_schema: type[BaseModel] = KOLBuysInput
53
51
 
54
52
  @retry(
55
53
  stop=stop_after_attempt(3), wait=wait_exponential(multiplier=5, min=5, max=60)
56
54
  )
57
55
  async def fetch_data(
58
56
  self, query_id: int, api_key: str, limit: int = 10
59
- ) -> Dict[str, Any]:
57
+ ) -> dict[str, Any]:
60
58
  """Fetch data for a specific Dune query.
61
59
 
62
60
  Args:
@@ -70,7 +68,7 @@ class FetchKOLBuys(DuneBaseTool):
70
68
  Raises:
71
69
  ToolException: If the API request fails.
72
70
  """
73
- from langchain.tools.base import ToolException
71
+ from langchain_core.tools.base import ToolException
74
72
 
75
73
  url = f"{BASE_URL}/{query_id}/results?limit={limit}"
76
74
  headers = {"X-Dune-API-Key": api_key}
@@ -5,13 +5,12 @@ Supports predefined metrics (e.g., total_users, unique_ai_citizens) or direct qu
5
5
 
6
6
  import difflib
7
7
  import re
8
- from typing import Any, Dict, Type
8
+ from typing import Any
9
9
 
10
10
  import httpx
11
11
  from pydantic import BaseModel, Field
12
12
  from tenacity import retry, stop_after_attempt, wait_exponential
13
13
 
14
- from intentkit.abstracts.skill import SkillStoreABC
15
14
  from intentkit.skills.dune_analytics.base import DuneBaseTool
16
15
 
17
16
  SUPPORTED_QUERIES = {
@@ -63,14 +62,14 @@ class MetricData(BaseModel):
63
62
  """Data model for a single metric result."""
64
63
 
65
64
  metric: str = Field(description="Metric name or query ID")
66
- data: Dict[str, Any] = Field(description="Metric data from Dune API")
65
+ data: dict[str, Any] = Field(description="Metric data from Dune API")
67
66
  error: str = Field(default="", description="Error message if fetch failed")
68
67
 
69
68
 
70
69
  class NationMetricsOutput(BaseModel):
71
70
  """Output schema for Crestal Nation metrics."""
72
71
 
73
- metrics: Dict[str, MetricData] = Field(
72
+ metrics: dict[str, MetricData] = Field(
74
73
  description="Dictionary of metric names or query IDs to their data"
75
74
  )
76
75
  summary: str = Field(description="Summary of fetched metrics")
@@ -85,8 +84,7 @@ class FetchNationMetrics(DuneBaseTool):
85
84
  "Supports predefined metrics, direct query IDs, or all configured metrics if none specified. "
86
85
  "Handles rate limits with retries."
87
86
  )
88
- args_schema: Type[BaseModel] = NationMetricsInput
89
- skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
87
+ args_schema: type[BaseModel] = NationMetricsInput
90
88
 
91
89
  def normalize_metric(self, metric: str) -> str:
92
90
  """Normalize a metric string for matching.
@@ -124,7 +122,7 @@ class FetchNationMetrics(DuneBaseTool):
124
122
  )
125
123
  async def fetch_data(
126
124
  self, query_id: int, api_key: str, limit: int = 1000
127
- ) -> Dict[str, Any]:
125
+ ) -> dict[str, Any]:
128
126
  """Fetch data for a specific Dune query.
129
127
 
130
128
  Args:
@@ -138,7 +136,7 @@ class FetchNationMetrics(DuneBaseTool):
138
136
  Raises:
139
137
  ToolException: If the API request fails.
140
138
  """
141
- from langchain.tools.base import ToolException
139
+ from langchain_core.tools.base import ToolException
142
140
 
143
141
  url = f"{BASE_URL}/{query_id}/results?limit={limit}"
144
142
  headers = {"X-Dune-API-Key": api_key}
@@ -1,99 +1,104 @@
1
- {
2
- "title": "Dune Analytics",
3
- "description": "Dune Analytics skills to fetch data from Dune Analytics API.",
4
- "x-icon": "https://ai.service.crestal.dev/skills/dune_analytics/dune.png",
5
- "type": "object",
6
- "properties": {
7
- "enabled": {
8
- "type": "boolean",
9
- "title": "Enabled",
10
- "description": "Whether this skill is enabled",
11
- "default": false
12
- },
13
- "states": {
14
- "title": "Skill States",
15
- "type": "object",
16
- "properties": {
17
- "fetch_nation_metrics": {
18
- "type": "string",
19
- "title": "Fetch Crestal Nation Metrics",
20
- "enum": [
21
- "disabled",
22
- "public",
23
- "private"
24
- ],
25
- "x-enum-title": [
26
- "Disabled",
27
- "Agent Owner + All Users",
28
- "Agent Owner Only"
29
- ],
30
- "description": "Fetches Crestal Nation metrics (e.g., total_users, agents/citizens, market_cap) from Dune Analytics API.",
31
- "default": "disabled"
32
- },
33
- "fetch_kol_buys": {
34
- "type": "string",
35
- "title": "Fetch KOL Memecoin Buys",
36
- "enum": [
37
- "disabled",
38
- "public",
39
- "private"
40
- ],
41
- "x-enum-title": [
42
- "Disabled",
43
- "Agent Owner + All Users",
44
- "Agent Owner Only"
45
- ],
46
- "description": "Fetches a list of KOL memecoin buy transactions on Solana from Dune Analytics API.",
47
- "default": "disabled"
48
- }
49
- }
50
- },
51
- "api_key_provider": {
52
- "type": "string",
53
- "title": "API Key Provider",
54
- "description": "Provider of the API key for Dune service",
55
- "enum": [
56
- "agent_owner"
57
- ],
58
- "x-enum-title": [
59
- "Owner Provided"
60
- ],
61
- "default": "agent_owner"
62
- }
63
- },
64
- "required": [
65
- "states",
66
- "enabled"
67
- ],
68
- "if": {
69
- "properties": {
70
- "api_key_provider": {
71
- "const": "agent_owner"
72
- }
73
- }
74
- },
75
- "then": {
76
- "properties": {
77
- "api_key": {
78
- "type": "string",
79
- "title": "Dune API Key",
80
- "description": "API key for Dune Analytics (X-Dune-API-Key).",
81
- "x-link": "[Get your API key](https://docs.dune.com/api-reference/overview/authentication)",
82
- "x-sensitive": true
83
- }
84
- },
85
- "if": {
86
- "properties": {
87
- "enabled": {
88
- "const": true
89
- }
90
- }
91
- },
92
- "then": {
93
- "required": [
94
- "api_key"
95
- ]
96
- }
97
- },
98
- "additionalProperties": true
99
- }
1
+ {
2
+ "title": "Dune Analytics",
3
+ "description": "Dune Analytics skills to fetch data from Dune Analytics API.",
4
+ "x-icon": "https://ai.service.crestal.dev/skills/dune_analytics/dune.png",
5
+ "type": "object",
6
+ "properties": {
7
+ "enabled": {
8
+ "type": "boolean",
9
+ "title": "Enabled",
10
+ "description": "Whether this skill is enabled",
11
+ "default": false
12
+ },
13
+ "states": {
14
+ "title": "Skill States",
15
+ "type": "object",
16
+ "properties": {
17
+ "fetch_nation_metrics": {
18
+ "type": "string",
19
+ "title": "Fetch Crestal Nation Metrics",
20
+ "enum": [
21
+ "disabled",
22
+ "public",
23
+ "private"
24
+ ],
25
+ "x-enum-title": [
26
+ "Disabled",
27
+ "Agent Owner + All Users",
28
+ "Agent Owner Only"
29
+ ],
30
+ "description": "Fetches Crestal Nation metrics (e.g., total_users, agents/citizens, market_cap) from Dune Analytics API.",
31
+ "default": "disabled"
32
+ },
33
+ "fetch_kol_buys": {
34
+ "type": "string",
35
+ "title": "Fetch KOL Memecoin Buys",
36
+ "enum": [
37
+ "disabled",
38
+ "public",
39
+ "private"
40
+ ],
41
+ "x-enum-title": [
42
+ "Disabled",
43
+ "Agent Owner + All Users",
44
+ "Agent Owner Only"
45
+ ],
46
+ "description": "Fetches a list of KOL memecoin buy transactions on Solana from Dune Analytics API.",
47
+ "default": "disabled"
48
+ }
49
+ }
50
+ },
51
+ "api_key_provider": {
52
+ "type": "string",
53
+ "title": "API Key Provider",
54
+ "description": "Provider of the API key for Dune service",
55
+ "enum": [
56
+ "agent_owner"
57
+ ],
58
+ "x-enum-title": [
59
+ "Owner Provided"
60
+ ],
61
+ "default": "agent_owner"
62
+ }
63
+ },
64
+ "required": [
65
+ "states",
66
+ "enabled"
67
+ ],
68
+ "if": {
69
+ "properties": {
70
+ "api_key_provider": {
71
+ "const": "agent_owner"
72
+ }
73
+ }
74
+ },
75
+ "then": {
76
+ "properties": {
77
+ "api_key": {
78
+ "type": "string",
79
+ "title": "Dune API Key",
80
+ "description": "API key for Dune Analytics (X-Dune-API-Key).",
81
+ "x-link": "[Get your API key](https://docs.dune.com/api-reference/overview/authentication)",
82
+ "x-sensitive": true
83
+ }
84
+ },
85
+ "if": {
86
+ "properties": {
87
+ "enabled": {
88
+ "const": true
89
+ }
90
+ }
91
+ },
92
+ "then": {
93
+ "required": [
94
+ "api_key"
95
+ ]
96
+ }
97
+ },
98
+ "additionalProperties": true,
99
+ "x-tags": [
100
+ "Analytics",
101
+ "Crypto",
102
+ "Knowledge Base"
103
+ ]
104
+ }
@@ -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.elfa.base import ElfaBaseTool
9
8
  from intentkit.skills.elfa.mention import (
@@ -36,7 +35,6 @@ class Config(SkillConfig):
36
35
  async def get_skills(
37
36
  config: "Config",
38
37
  is_private: bool,
39
- store: SkillStoreABC,
40
38
  **_,
41
39
  ) -> list[ElfaBaseTool]:
42
40
  """Get all Elfa skills.
@@ -44,7 +42,6 @@ async def get_skills(
44
42
  Args:
45
43
  config: The configuration for Elfa skills.
46
44
  is_private: Whether to include private skills.
47
- store: The skill store for persisting data.
48
45
 
49
46
  Returns:
50
47
  A list of Elfa skills.
@@ -61,7 +58,7 @@ async def get_skills(
61
58
  # Get each skill using the cached getter
62
59
  result = []
63
60
  for name in available_skills:
64
- skill = get_elfa_skill(name, store)
61
+ skill = get_elfa_skill(name)
65
62
  if skill:
66
63
  result.append(skill)
67
64
  return result
@@ -69,13 +66,11 @@ async def get_skills(
69
66
 
70
67
  def get_elfa_skill(
71
68
  name: str,
72
- store: SkillStoreABC,
73
69
  ) -> ElfaBaseTool:
74
70
  """Get an Elfa skill by name.
75
71
 
76
72
  Args:
77
73
  name: The name of the skill to get
78
- store: The skill store for persisting data
79
74
 
80
75
  Returns:
81
76
  The requested Elfa skill
@@ -83,30 +78,22 @@ def get_elfa_skill(
83
78
 
84
79
  if name == "get_top_mentions":
85
80
  if name not in _cache:
86
- _cache[name] = ElfaGetTopMentions(
87
- skill_store=store,
88
- )
81
+ _cache[name] = ElfaGetTopMentions()
89
82
  return _cache[name]
90
83
 
91
84
  elif name == "search_mentions":
92
85
  if name not in _cache:
93
- _cache[name] = ElfaSearchMentions(
94
- skill_store=store,
95
- )
86
+ _cache[name] = ElfaSearchMentions()
96
87
  return _cache[name]
97
88
 
98
89
  elif name == "get_trending_tokens":
99
90
  if name not in _cache:
100
- _cache[name] = ElfaGetTrendingTokens(
101
- skill_store=store,
102
- )
91
+ _cache[name] = ElfaGetTrendingTokens()
103
92
  return _cache[name]
104
93
 
105
94
  elif name == "get_smart_stats":
106
95
  if name not in _cache:
107
- _cache[name] = ElfaGetSmartStats(
108
- skill_store=store,
109
- )
96
+ _cache[name] = ElfaGetSmartStats()
110
97
  return _cache[name]
111
98
 
112
99
  else:
@@ -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
  base_url = "https://api.elfa.ai/v2"
@@ -14,24 +12,22 @@ class ElfaBaseTool(IntentKitSkill):
14
12
 
15
13
  name: str = Field(description="The name of the tool")
16
14
  description: str = Field(description="A description of what the tool does")
17
- args_schema: Type[BaseModel]
18
- skill_store: SkillStoreABC = Field(
19
- description="The skill store for persisting data"
20
- )
15
+ args_schema: type[BaseModel]
21
16
 
22
17
  def get_api_key(self) -> str:
23
18
  context = self.get_context()
24
19
  skill_config = context.agent.skill_config(self.category)
25
20
  api_key_provider = skill_config.get("api_key_provider")
26
21
  if api_key_provider == "platform":
27
- return self.skill_store.get_system_config("elfa_api_key")
22
+ if not config.elfa_api_key:
23
+ raise ToolException("Elfa API key is not configured")
24
+ return config.elfa_api_key
28
25
  # for backward compatibility, may only have api_key in skill_config
29
- elif skill_config.get("api_key"):
26
+ if skill_config.get("api_key"):
30
27
  return skill_config.get("api_key")
31
- else:
32
- raise ToolException(
33
- f"Invalid API key provider: {api_key_provider}, or no api_key in config"
34
- )
28
+ raise ToolException(
29
+ f"Invalid API key provider: {api_key_provider}, or no api_key in config"
30
+ )
35
31
 
36
32
  @property
37
33
  def category(self) -> str:
@@ -1,6 +1,6 @@
1
1
  """Mention-related skills for Elfa AI API."""
2
2
 
3
- from typing import Any, Dict, List, Optional, Type
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -12,19 +12,19 @@ class ElfaGetTopMentionsInput(BaseModel):
12
12
  """Input parameters for top mentions."""
13
13
 
14
14
  ticker: str = Field(description="Stock ticker symbol (e.g., ETH, $ETH, BTC, $BTC)")
15
- timeWindow: Optional[str] = Field(
15
+ timeWindow: str | None = Field(
16
16
  "1h", description="Time window (e.g., '1h', '24h', '7d')"
17
17
  )
18
- page: Optional[int] = Field(1, description="Page number for pagination")
19
- pageSize: Optional[int] = Field(10, description="Number of items per page")
18
+ page: int | None = Field(1, description="Page number for pagination")
19
+ pageSize: int | None = Field(10, description="Number of items per page")
20
20
 
21
21
 
22
22
  class ElfaGetTopMentionsOutput(BaseModel):
23
23
  """Output structure for top mentions response."""
24
24
 
25
25
  success: bool
26
- data: Optional[List[MentionData]] = Field(None, description="List of top mentions")
27
- metadata: Optional[Dict[str, Any]] = Field(None, description="Response metadata")
26
+ data: list[MentionData] | None = Field(None, description="List of top mentions")
27
+ metadata: dict[str, Any] | None = Field(None, description="Response metadata")
28
28
 
29
29
 
30
30
  class ElfaGetTopMentions(ElfaBaseTool):
@@ -46,7 +46,7 @@ class ElfaGetTopMentions(ElfaBaseTool):
46
46
  Updated hourly. Returns engagement metrics and account information for market sentiment analysis.
47
47
 
48
48
  Use this to track public opinion, identify trending news, and monitor investor discussions."""
49
- args_schema: Type[BaseModel] = ElfaGetTopMentionsInput
49
+ args_schema: type[BaseModel] = ElfaGetTopMentionsInput
50
50
 
51
51
  async def _arun(
52
52
  self,
@@ -102,30 +102,28 @@ class ElfaGetTopMentions(ElfaBaseTool):
102
102
  class ElfaSearchMentionsInput(BaseModel):
103
103
  """Input parameters for search mentions."""
104
104
 
105
- keywords: Optional[str] = Field(
105
+ keywords: str | None = Field(
106
106
  None,
107
107
  description="Up to 5 keywords to search for, separated by commas. Phrases accepted",
108
108
  )
109
- accountName: Optional[str] = Field(
109
+ accountName: str | None = Field(
110
110
  None,
111
111
  description="Account username to filter by (optional if keywords provided)",
112
112
  )
113
- timeWindow: Optional[str] = Field("7d", description="Time window for search")
114
- limit: Optional[int] = Field(20, description="Number of results to return (max 30)")
115
- searchType: Optional[str] = Field(
116
- "or", description="Type of search ('and' or 'or')"
117
- )
118
- cursor: Optional[str] = Field(None, description="Cursor for pagination")
113
+ timeWindow: str | None = Field("7d", description="Time window for search")
114
+ limit: int | None = Field(20, description="Number of results to return (max 30)")
115
+ searchType: str | None = Field("or", description="Type of search ('and' or 'or')")
116
+ cursor: str | None = Field(None, description="Cursor for pagination")
119
117
 
120
118
 
121
119
  class ElfaSearchMentionsOutput(BaseModel):
122
120
  """Output structure for search mentions response."""
123
121
 
124
122
  success: bool
125
- data: Optional[List[MentionData]] = Field(
123
+ data: list[MentionData] | None = Field(
126
124
  None, description="List of matching mentions"
127
125
  )
128
- metadata: Optional[Dict[str, Any]] = Field(
126
+ metadata: dict[str, Any] | None = Field(
129
127
  None, description="Response metadata with cursor"
130
128
  )
131
129
 
@@ -150,16 +148,16 @@ class ElfaSearchMentions(ElfaBaseTool):
150
148
  Updated every 5 minutes. Access 30 days of recent data or historical archives.
151
149
 
152
150
  Use this for market research, brand monitoring, opinion tracking, and competitive analysis."""
153
- args_schema: Type[BaseModel] = ElfaSearchMentionsInput
151
+ args_schema: type[BaseModel] = ElfaSearchMentionsInput
154
152
 
155
153
  async def _arun(
156
154
  self,
157
- keywords: Optional[str] = None,
158
- accountName: Optional[str] = None,
155
+ keywords: str | None = None,
156
+ accountName: str | None = None,
159
157
  timeWindow: str = "7d",
160
158
  limit: int = 20,
161
159
  searchType: str = "or",
162
- cursor: Optional[str] = None,
160
+ cursor: str | None = None,
163
161
  **kwargs,
164
162
  ) -> ElfaSearchMentionsOutput:
165
163
  """
@@ -5,7 +5,8 @@
5
5
  "description": "Integration with Elfa AI API providing data analysis and processing capabilities with secure authentication for advanced data operations",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/elfa/elfa.jpg",
7
7
  "x-tags": [
8
- "Data"
8
+ "AI",
9
+ "Analytics"
9
10
  ],
10
11
  "x-nft-requirement": 1,
11
12
  "properties": {
@@ -13,7 +14,7 @@
13
14
  "type": "boolean",
14
15
  "title": "Enabled",
15
16
  "description": "Whether this skill is enabled",
16
- "default": true
17
+ "default": false
17
18
  },
18
19
  "states": {
19
20
  "type": "object",
@@ -1,6 +1,6 @@
1
1
  """Smart stats skill for Elfa AI API."""
2
2
 
3
- from typing import Any, Dict, Optional, Type
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -18,8 +18,8 @@ class ElfaGetSmartStatsOutput(BaseModel):
18
18
  """Output structure for smart stats response."""
19
19
 
20
20
  success: bool
21
- data: Optional[SmartStatsData] = Field(None, description="Smart stats data")
22
- metadata: Optional[Dict[str, Any]] = Field(None, description="Response metadata")
21
+ data: SmartStatsData | None = Field(None, description="Smart stats data")
22
+ metadata: dict[str, Any] | None = Field(None, description="Response metadata")
23
23
 
24
24
 
25
25
  class ElfaGetSmartStats(ElfaBaseTool):
@@ -43,7 +43,7 @@ class ElfaGetSmartStats(ElfaBaseTool):
43
43
  description: str = """Get comprehensive social media metrics for a username including smart following count,
44
44
  engagement scores, and follower analytics. Use this for competitor analysis, influencer identification,
45
45
  and social media performance audits."""
46
- args_schema: Type[BaseModel] = ElfaGetSmartStatsInput
46
+ args_schema: type[BaseModel] = ElfaGetSmartStatsInput
47
47
 
48
48
  async def _arun(self, username: str, **kwargs) -> ElfaGetSmartStatsOutput:
49
49
  """
@@ -1,6 +1,6 @@
1
1
  """Trending tokens skill for Elfa AI API."""
2
2
 
3
- from typing import Any, Dict, List, Optional, Type
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -11,13 +11,13 @@ from .utils import make_elfa_request
11
11
  class ElfaGetTrendingTokensInput(BaseModel):
12
12
  """Input parameters for trending tokens."""
13
13
 
14
- timeWindow: Optional[str] = Field(
14
+ timeWindow: str | None = Field(
15
15
  "7d",
16
16
  description="Time window for trending analysis (e.g., '30m', '1h', '4h', '24h', '7d', '30d')",
17
17
  )
18
- page: Optional[int] = Field(1, description="Page number for pagination")
19
- pageSize: Optional[int] = Field(50, description="Number of items per page")
20
- minMentions: Optional[int] = Field(
18
+ page: int | None = Field(1, description="Page number for pagination")
19
+ pageSize: int | None = Field(50, description="Number of items per page")
20
+ minMentions: int | None = Field(
21
21
  5, description="Minimum number of mentions required"
22
22
  )
23
23
 
@@ -25,20 +25,20 @@ class ElfaGetTrendingTokensInput(BaseModel):
25
25
  class TrendingToken(BaseModel):
26
26
  """Individual trending token data."""
27
27
 
28
- token: Optional[str] = Field(None, description="Token symbol")
29
- current_count: Optional[int] = Field(None, description="Current mention count")
30
- previous_count: Optional[int] = Field(None, description="Previous mention count")
31
- change_percent: Optional[float] = Field(None, description="Change percentage")
28
+ token: str | None = Field(None, description="Token symbol")
29
+ current_count: int | None = Field(None, description="Current mention count")
30
+ previous_count: int | None = Field(None, description="Previous mention count")
31
+ change_percent: float | None = Field(None, description="Change percentage")
32
32
 
33
33
 
34
34
  class ElfaGetTrendingTokensOutput(BaseModel):
35
35
  """Output structure for trending tokens response."""
36
36
 
37
37
  success: bool
38
- data: Optional[List[TrendingToken]] = Field(
38
+ data: list[TrendingToken] | None = Field(
39
39
  None, description="List of trending tokens"
40
40
  )
41
- metadata: Optional[Dict[str, Any]] = Field(None, description="Response metadata")
41
+ metadata: dict[str, Any] | None = Field(None, description="Response metadata")
42
42
 
43
43
 
44
44
  class ElfaGetTrendingTokens(ElfaBaseTool):
@@ -60,7 +60,7 @@ class ElfaGetTrendingTokens(ElfaBaseTool):
60
60
  Updated every 5 minutes. Smart mentions provide sophisticated discussion volume measurement beyond simple keyword counts.
61
61
 
62
62
  Use this to identify tokens gaining traction, gauge market sentiment, and research potential investments."""
63
- args_schema: Type[BaseModel] = ElfaGetTrendingTokensInput
63
+ args_schema: type[BaseModel] = ElfaGetTrendingTokensInput
64
64
 
65
65
  async def _arun(
66
66
  self,