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
- from typing import Type
2
-
3
1
  import httpx
4
- from langchain.tools.base import ToolException
2
+ from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.enso.networks import EnsoGetNetworks
8
6
 
9
- from .base import EnsoBaseTool, base_url, default_chain_id
7
+ from .base import EnsoBaseTool, base_url, format_amount_with_decimals
10
8
 
11
9
 
12
10
  class EnsoRouteShortcutInput(BaseModel):
@@ -18,9 +16,9 @@ class EnsoRouteShortcutInput(BaseModel):
18
16
  False,
19
17
  description="Whether to broadcast the transaction or not, this is false by default.",
20
18
  )
21
- chainId: int = Field(
22
- default_chain_id,
23
- description="(Optional) Chain ID of the network to execute the transaction on. the default value is the chain_id extracted from networks according to tokenIn and tokenOut",
19
+ chainId: int | None = Field(
20
+ None,
21
+ description="(Optional) Chain ID of the network to execute the transaction on. Defaults to the agent's configured network.",
24
22
  )
25
23
  amountIn: list[int] = Field(
26
24
  description="Amount of tokenIn to swap in wei, you should multiply user's requested value by token decimals."
@@ -155,14 +153,14 @@ class EnsoRouteShortcut(EnsoBaseTool):
155
153
 
156
154
  name: str = "enso_route_shortcut"
157
155
  description: str = "This tool is used specifically for broadcasting a route transaction calldata to the network. It should only be used when the user explicitly requests to broadcast a route transaction with routeId."
158
- args_schema: Type[BaseModel] = EnsoRouteShortcutInput
156
+ args_schema: type[BaseModel] = EnsoRouteShortcutInput
159
157
 
160
158
  async def _arun(
161
159
  self,
162
160
  amountIn: list[int],
163
161
  tokenIn: list[str],
164
162
  tokenOut: list[str],
165
- chainId: int = default_chain_id,
163
+ chainId: int | None = None,
166
164
  broadcast_requested: bool = False,
167
165
  **kwargs,
168
166
  ) -> EnsoRouteShortcutOutput:
@@ -173,7 +171,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
173
171
  amountIn (list[int]): Amount of tokenIn to swap in wei, you should multiply user's requested value by token decimals.
174
172
  tokenIn (list[str]): Ethereum address of the token to swap or enter into a position from (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee).
175
173
  tokenOut (list[str]): Ethereum address of the token to swap or enter into a position to (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee).
176
- chainId (int): The chain id of the network to be used for swap, deposit and routing.
174
+ chainId (int | None): The chain id of the network to be used for swap, deposit and routing. Defaults to the agent's configured network.
177
175
  broadcast_requested (bool): User should ask for broadcasting the transaction explicitly, otherwise it is always false.
178
176
 
179
177
  Returns:
@@ -181,35 +179,36 @@ class EnsoRouteShortcut(EnsoBaseTool):
181
179
  """
182
180
 
183
181
  context = self.get_context()
184
- agent_id = context.agent_id
182
+ resolved_chain_id = self.resolve_chain_id(context, chainId)
185
183
  api_token = self.get_api_token(context)
186
- account = await self.get_account(context)
184
+ # Use the wallet provider to send the transaction
185
+ wallet_provider = await self.get_wallet_provider(context)
186
+ wallet_address = wallet_provider.get_address()
187
187
 
188
188
  async with httpx.AsyncClient() as client:
189
189
  try:
190
190
  network_name = None
191
- networks = await self.skill_store.get_agent_skill_data(
192
- agent_id, "enso_get_networks", "networks"
191
+ networks = await self.get_agent_skill_data_raw(
192
+ "enso_get_networks", "networks"
193
193
  )
194
194
 
195
195
  if networks:
196
+ resolved_key = str(resolved_chain_id)
196
197
  network_name = (
197
- networks.get(str(chainId)).get("name")
198
- if networks.get(str(chainId))
198
+ networks.get(resolved_key).get("name")
199
+ if networks.get(resolved_key)
199
200
  else None
200
201
  )
201
202
  if network_name is None:
202
- networks = await EnsoGetNetworks(
203
- skill_store=self.skill_store,
204
- ).arun()
203
+ networks = await EnsoGetNetworks().arun()
205
204
 
206
205
  for network in networks.res:
207
- if network.id == chainId:
206
+ if network.id == resolved_chain_id:
208
207
  network_name = network.name
209
208
 
210
209
  if not network_name:
211
210
  raise ToolException(
212
- f"network name not found for chainId: {chainId}"
211
+ f"network name not found for chainId: {resolved_chain_id}"
213
212
  )
214
213
 
215
214
  headers = {
@@ -217,8 +216,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
217
216
  "Authorization": f"Bearer {api_token}",
218
217
  }
219
218
 
220
- token_decimals = await self.skill_store.get_agent_skill_data(
221
- agent_id,
219
+ token_decimals = await self.get_agent_skill_data_raw(
222
220
  "enso_get_tokens",
223
221
  "decimals",
224
222
  )
@@ -242,13 +240,13 @@ class EnsoRouteShortcut(EnsoBaseTool):
242
240
 
243
241
  # Prepare query parameters
244
242
  params = EnsoRouteShortcutInput(
245
- chainId=chainId,
243
+ chainId=resolved_chain_id,
246
244
  amountIn=amountIn,
247
245
  tokenIn=tokenIn,
248
246
  tokenOut=tokenOut,
249
247
  ).model_dump(exclude_none=True)
250
248
 
251
- params["fromAddress"] = account.address
249
+ params["fromAddress"] = wallet_address
252
250
 
253
251
  response = await client.get(url, headers=headers, params=params)
254
252
  response.raise_for_status() # Raise HTTPError for non-2xx responses
@@ -256,26 +254,24 @@ class EnsoRouteShortcut(EnsoBaseTool):
256
254
 
257
255
  res = EnsoRouteShortcutOutput(**json_dict)
258
256
  res.network = network_name
259
-
260
- res.amountOut = str(
261
- float(res.amountOut) / 10 ** token_decimals[tokenOut[0]]
257
+ decimals = token_decimals.get(tokenOut[0])
258
+ amount_out = format_amount_with_decimals(
259
+ json_dict.get("amountOut"), decimals
262
260
  )
261
+ if amount_out is not None:
262
+ res.amountOut = amount_out
263
263
 
264
264
  if broadcast_requested:
265
- # Use the wallet provider to send the transaction
266
- wallet_provider = await self.get_wallet_provider(context)
267
-
268
265
  # Extract transaction data from the Enso API response
269
266
  tx_data = json_dict.get("tx", {})
270
267
  if tx_data:
271
268
  # Send the transaction using the wallet provider
272
- tx_hash = wallet_provider.send_transaction(
273
- {
274
- "to": tx_data.get("to"),
275
- "data": tx_data.get("data", "0x"),
276
- "value": tx_data.get("value", 0),
277
- }
278
- )
269
+ tx_params = {
270
+ "to": tx_data.get("to"),
271
+ "data": tx_data.get("data", "0x"),
272
+ "value": tx_data.get("value", 0),
273
+ }
274
+ tx_hash = wallet_provider.send_transaction(tx_params)
279
275
 
280
276
  # Wait for transaction confirmation
281
277
  wallet_provider.wait_for_transaction_receipt(tx_hash)
@@ -5,7 +5,8 @@
5
5
  "description": "Integration with Enso Finance API providing DeFi trading and portfolio management capabilities across multiple blockchain networks",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/enso/enso.jpg",
7
7
  "x-tags": [
8
- "Blockchain"
8
+ "Analytics",
9
+ "DeFi"
9
10
  ],
10
11
  "properties": {
11
12
  "enabled": {
@@ -209,4 +210,4 @@
209
210
  }
210
211
  },
211
212
  "additionalProperties": true
212
- }
213
+ }
@@ -1,14 +1,8 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
- from langchain.tools.base import ToolException
2
+ from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
6
4
 
7
- from intentkit.skills.enso.base import (
8
- EnsoBaseTool,
9
- base_url,
10
- default_chain_id,
11
- )
5
+ from intentkit.skills.enso.base import EnsoBaseTool, base_url
12
6
 
13
7
  # Actual Enso output types
14
8
  # class UnderlyingToken(BaseModel):
@@ -50,9 +44,9 @@ from intentkit.skills.enso.base import (
50
44
 
51
45
 
52
46
  class EnsoGetTokensInput(BaseModel):
53
- chainId: int = Field(
54
- default_chain_id,
55
- description="The blockchain chain ID",
47
+ chainId: int | None = Field(
48
+ None,
49
+ description="The blockchain chain ID. Defaults to the agent's configured network.",
56
50
  )
57
51
  protocolSlug: str | None = Field(
58
52
  None,
@@ -110,7 +104,10 @@ class TokenResponseCompact(BaseModel):
110
104
 
111
105
 
112
106
  class EnsoGetTokensOutput(BaseModel):
113
- res: list[TokenResponseCompact] | None
107
+ res: list[TokenResponseCompact] = Field(
108
+ default_factory=list,
109
+ description="List of token information entries",
110
+ )
114
111
 
115
112
 
116
113
  class EnsoGetTokens(EnsoBaseTool):
@@ -134,11 +131,11 @@ class EnsoGetTokens(EnsoBaseTool):
134
131
  "Enso Finance Token Information Tool: Retrieves detailed token information from the Enso Finance API, "
135
132
  "including APY, symbol, address, protocol slug, token type, and underlying tokens."
136
133
  )
137
- args_schema: Type[BaseModel] = EnsoGetTokensInput
134
+ args_schema: type[BaseModel] = EnsoGetTokensInput
138
135
 
139
136
  async def _arun(
140
137
  self,
141
- chainId: int = default_chain_id,
138
+ chainId: int | None = None,
142
139
  protocolSlug: str | None = None,
143
140
  **kwargs,
144
141
  ) -> EnsoGetTokensOutput:
@@ -155,16 +152,17 @@ class EnsoGetTokens(EnsoBaseTool):
155
152
  url = f"{base_url}/api/v1/tokens"
156
153
 
157
154
  context = self.get_context()
158
- agent_id = context.agent_id
155
+ resolved_chain_id = self.resolve_chain_id(context, chainId)
159
156
  api_token = self.get_api_token(context)
160
157
  main_tokens = self.get_main_tokens(context)
158
+ main_tokens_upper = {token.upper() for token in main_tokens}
161
159
  headers = {
162
160
  "accept": "application/json",
163
161
  "Authorization": f"Bearer {api_token}",
164
162
  }
165
163
 
166
164
  params = EnsoGetTokensInput(
167
- chainId=chainId,
165
+ chainId=resolved_chain_id,
168
166
  protocolSlug=protocolSlug,
169
167
  ).model_dump(exclude_none=True)
170
168
 
@@ -177,35 +175,28 @@ class EnsoGetTokens(EnsoBaseTool):
177
175
  response.raise_for_status()
178
176
  json_dict = response.json()
179
177
 
180
- token_decimals = await self.skill_store.get_agent_skill_data(
181
- agent_id,
182
- "enso_get_tokens",
183
- "decimals",
184
- )
178
+ token_decimals = await self.get_agent_skill_data("decimals")
185
179
  if not token_decimals:
186
180
  token_decimals = {}
187
181
 
188
182
  # filter the main tokens from config or the ones that have apy assigned.
189
- res = EnsoGetTokensOutput(res=list[TokenResponseCompact]())
190
- for item in json_dict["data"]:
191
- main_tokens = [item.upper() for item in main_tokens]
192
- if item.get("apy") or (item.get("symbol").upper() in main_tokens):
183
+ res = EnsoGetTokensOutput()
184
+ for item in json_dict.get("data", []):
185
+ symbol = item.get("symbol", "").upper()
186
+ has_apy = bool(item.get("apy"))
187
+ if has_apy or symbol in main_tokens_upper:
193
188
  token_response = TokenResponseCompact(**item)
194
189
  res.res.append(token_response)
195
- token_decimals[token_response.address] = token_response.decimals
196
- if (
197
- token_response.underlyingTokens
198
- and len(token_response.underlyingTokens) > 0
199
- ):
190
+ if token_response.address:
191
+ token_decimals[token_response.address] = (
192
+ token_response.decimals
193
+ )
194
+ if token_response.underlyingTokens:
200
195
  for u_token in token_response.underlyingTokens:
201
- token_decimals[u_token.address] = u_token.decimals
202
-
203
- await self.skill_store.save_agent_skill_data(
204
- agent_id,
205
- "enso_get_tokens",
206
- "decimals",
207
- token_decimals,
208
- )
196
+ if u_token.address:
197
+ token_decimals[u_token.address] = u_token.decimals
198
+
199
+ await self.save_agent_skill_data("decimals", token_decimals)
209
200
 
210
201
  return res
211
202
  except httpx.RequestError as req_err: