intentkit 0.5.0__py3-none-any.whl → 0.5.2__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (366) hide show
  1. intentkit/__init__.py +17 -0
  2. intentkit/abstracts/__init__.py +0 -0
  3. intentkit/abstracts/agent.py +60 -0
  4. intentkit/abstracts/api.py +4 -0
  5. intentkit/abstracts/engine.py +38 -0
  6. intentkit/abstracts/exception.py +9 -0
  7. intentkit/abstracts/graph.py +25 -0
  8. intentkit/abstracts/skill.py +129 -0
  9. intentkit/abstracts/twitter.py +54 -0
  10. intentkit/clients/__init__.py +14 -0
  11. intentkit/clients/cdp.py +53 -0
  12. intentkit/clients/twitter.py +445 -0
  13. intentkit/config/__init__.py +0 -0
  14. intentkit/config/config.py +164 -0
  15. intentkit/core/__init__.py +0 -0
  16. intentkit/core/agent.py +191 -0
  17. intentkit/core/api.py +40 -0
  18. intentkit/core/client.py +45 -0
  19. intentkit/core/credit.py +1767 -0
  20. intentkit/core/engine.py +1018 -0
  21. intentkit/core/node.py +223 -0
  22. intentkit/core/prompt.py +58 -0
  23. intentkit/core/skill.py +124 -0
  24. intentkit/models/agent.py +1689 -0
  25. intentkit/models/agent_data.py +810 -0
  26. intentkit/models/agent_schema.json +733 -0
  27. intentkit/models/app_setting.py +156 -0
  28. intentkit/models/base.py +9 -0
  29. intentkit/models/chat.py +581 -0
  30. intentkit/models/conversation.py +286 -0
  31. intentkit/models/credit.py +1406 -0
  32. intentkit/models/db.py +120 -0
  33. intentkit/models/db_mig.py +102 -0
  34. intentkit/models/generator.py +347 -0
  35. intentkit/models/llm.py +746 -0
  36. intentkit/models/redis.py +132 -0
  37. intentkit/models/skill.py +466 -0
  38. intentkit/models/user.py +243 -0
  39. intentkit/skills/__init__.py +12 -0
  40. intentkit/skills/acolyt/__init__.py +83 -0
  41. intentkit/skills/acolyt/acolyt.jpg +0 -0
  42. intentkit/skills/acolyt/ask.py +128 -0
  43. intentkit/skills/acolyt/base.py +28 -0
  44. intentkit/skills/acolyt/schema.json +89 -0
  45. intentkit/skills/aixbt/README.md +71 -0
  46. intentkit/skills/aixbt/__init__.py +73 -0
  47. intentkit/skills/aixbt/aixbt.jpg +0 -0
  48. intentkit/skills/aixbt/base.py +21 -0
  49. intentkit/skills/aixbt/projects.py +153 -0
  50. intentkit/skills/aixbt/schema.json +99 -0
  51. intentkit/skills/allora/__init__.py +83 -0
  52. intentkit/skills/allora/allora.jpeg +0 -0
  53. intentkit/skills/allora/base.py +28 -0
  54. intentkit/skills/allora/price.py +130 -0
  55. intentkit/skills/allora/schema.json +89 -0
  56. intentkit/skills/base.py +174 -0
  57. intentkit/skills/carv/README.md +95 -0
  58. intentkit/skills/carv/__init__.py +121 -0
  59. intentkit/skills/carv/base.py +183 -0
  60. intentkit/skills/carv/carv.webp +0 -0
  61. intentkit/skills/carv/fetch_news.py +92 -0
  62. intentkit/skills/carv/onchain_query.py +164 -0
  63. intentkit/skills/carv/schema.json +137 -0
  64. intentkit/skills/carv/token_info_and_price.py +110 -0
  65. intentkit/skills/cdp/__init__.py +137 -0
  66. intentkit/skills/cdp/base.py +21 -0
  67. intentkit/skills/cdp/cdp.png +0 -0
  68. intentkit/skills/cdp/get_balance.py +81 -0
  69. intentkit/skills/cdp/schema.json +473 -0
  70. intentkit/skills/chainlist/README.md +38 -0
  71. intentkit/skills/chainlist/__init__.py +54 -0
  72. intentkit/skills/chainlist/base.py +21 -0
  73. intentkit/skills/chainlist/chain_lookup.py +208 -0
  74. intentkit/skills/chainlist/chainlist.png +0 -0
  75. intentkit/skills/chainlist/schema.json +47 -0
  76. intentkit/skills/common/__init__.py +82 -0
  77. intentkit/skills/common/base.py +21 -0
  78. intentkit/skills/common/common.jpg +0 -0
  79. intentkit/skills/common/current_time.py +84 -0
  80. intentkit/skills/common/schema.json +57 -0
  81. intentkit/skills/cookiefun/README.md +121 -0
  82. intentkit/skills/cookiefun/__init__.py +78 -0
  83. intentkit/skills/cookiefun/base.py +41 -0
  84. intentkit/skills/cookiefun/constants.py +18 -0
  85. intentkit/skills/cookiefun/cookiefun.png +0 -0
  86. intentkit/skills/cookiefun/get_account_details.py +171 -0
  87. intentkit/skills/cookiefun/get_account_feed.py +282 -0
  88. intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
  89. intentkit/skills/cookiefun/get_sectors.py +128 -0
  90. intentkit/skills/cookiefun/schema.json +155 -0
  91. intentkit/skills/cookiefun/search_accounts.py +225 -0
  92. intentkit/skills/cryptocompare/__init__.py +130 -0
  93. intentkit/skills/cryptocompare/api.py +159 -0
  94. intentkit/skills/cryptocompare/base.py +303 -0
  95. intentkit/skills/cryptocompare/cryptocompare.png +0 -0
  96. intentkit/skills/cryptocompare/fetch_news.py +96 -0
  97. intentkit/skills/cryptocompare/fetch_price.py +99 -0
  98. intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
  99. intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
  100. intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
  101. intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
  102. intentkit/skills/cryptocompare/schema.json +168 -0
  103. intentkit/skills/cryptopanic/__init__.py +108 -0
  104. intentkit/skills/cryptopanic/base.py +51 -0
  105. intentkit/skills/cryptopanic/cryptopanic.png +0 -0
  106. intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
  107. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
  108. intentkit/skills/cryptopanic/schema.json +103 -0
  109. intentkit/skills/dapplooker/README.md +92 -0
  110. intentkit/skills/dapplooker/__init__.py +83 -0
  111. intentkit/skills/dapplooker/base.py +26 -0
  112. intentkit/skills/dapplooker/dapplooker.jpg +0 -0
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
  114. intentkit/skills/dapplooker/schema.json +91 -0
  115. intentkit/skills/defillama/__init__.py +323 -0
  116. intentkit/skills/defillama/api.py +315 -0
  117. intentkit/skills/defillama/base.py +135 -0
  118. intentkit/skills/defillama/coins/__init__.py +0 -0
  119. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
  120. intentkit/skills/defillama/coins/fetch_block.py +98 -0
  121. intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
  122. intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
  123. intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
  124. intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
  125. intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
  126. intentkit/skills/defillama/config/__init__.py +0 -0
  127. intentkit/skills/defillama/config/chains.py +433 -0
  128. intentkit/skills/defillama/defillama.jpeg +0 -0
  129. intentkit/skills/defillama/fees/__init__.py +0 -0
  130. intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
  131. intentkit/skills/defillama/schema.json +383 -0
  132. intentkit/skills/defillama/stablecoins/__init__.py +0 -0
  133. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
  134. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
  135. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
  136. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
  137. intentkit/skills/defillama/tests/__init__.py +0 -0
  138. intentkit/skills/defillama/tests/api_integration.test.py +192 -0
  139. intentkit/skills/defillama/tests/api_unit.test.py +583 -0
  140. intentkit/skills/defillama/tvl/__init__.py +0 -0
  141. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
  142. intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
  143. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
  144. intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
  145. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
  146. intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
  147. intentkit/skills/defillama/volumes/__init__.py +0 -0
  148. intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
  149. intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
  150. intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
  151. intentkit/skills/defillama/yields/__init__.py +0 -0
  152. intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
  153. intentkit/skills/defillama/yields/fetch_pools.py +126 -0
  154. intentkit/skills/dexscreener/__init__.py +93 -0
  155. intentkit/skills/dexscreener/base.py +133 -0
  156. intentkit/skills/dexscreener/dexscreener.png +0 -0
  157. intentkit/skills/dexscreener/model/__init__.py +0 -0
  158. intentkit/skills/dexscreener/model/search_token_response.py +82 -0
  159. intentkit/skills/dexscreener/schema.json +48 -0
  160. intentkit/skills/dexscreener/search_token.py +321 -0
  161. intentkit/skills/dune_analytics/__init__.py +103 -0
  162. intentkit/skills/dune_analytics/base.py +46 -0
  163. intentkit/skills/dune_analytics/dune.png +0 -0
  164. intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
  165. intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
  166. intentkit/skills/dune_analytics/schema.json +99 -0
  167. intentkit/skills/elfa/README.md +100 -0
  168. intentkit/skills/elfa/__init__.py +123 -0
  169. intentkit/skills/elfa/base.py +28 -0
  170. intentkit/skills/elfa/elfa.jpg +0 -0
  171. intentkit/skills/elfa/mention.py +504 -0
  172. intentkit/skills/elfa/schema.json +153 -0
  173. intentkit/skills/elfa/stats.py +118 -0
  174. intentkit/skills/elfa/tokens.py +126 -0
  175. intentkit/skills/enso/README.md +75 -0
  176. intentkit/skills/enso/__init__.py +114 -0
  177. intentkit/skills/enso/abi/__init__.py +0 -0
  178. intentkit/skills/enso/abi/approval.py +279 -0
  179. intentkit/skills/enso/abi/erc20.py +14 -0
  180. intentkit/skills/enso/abi/route.py +129 -0
  181. intentkit/skills/enso/base.py +44 -0
  182. intentkit/skills/enso/best_yield.py +286 -0
  183. intentkit/skills/enso/enso.jpg +0 -0
  184. intentkit/skills/enso/networks.py +105 -0
  185. intentkit/skills/enso/prices.py +93 -0
  186. intentkit/skills/enso/route.py +300 -0
  187. intentkit/skills/enso/schema.json +212 -0
  188. intentkit/skills/enso/tokens.py +223 -0
  189. intentkit/skills/enso/wallet.py +381 -0
  190. intentkit/skills/github/README.md +63 -0
  191. intentkit/skills/github/__init__.py +54 -0
  192. intentkit/skills/github/base.py +21 -0
  193. intentkit/skills/github/github.jpg +0 -0
  194. intentkit/skills/github/github_search.py +183 -0
  195. intentkit/skills/github/schema.json +59 -0
  196. intentkit/skills/heurist/__init__.py +143 -0
  197. intentkit/skills/heurist/base.py +26 -0
  198. intentkit/skills/heurist/heurist.png +0 -0
  199. intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
  200. intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
  201. intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
  202. intentkit/skills/heurist/image_generation_braindance.py +162 -0
  203. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
  204. intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
  205. intentkit/skills/heurist/image_generation_sdxl.py +161 -0
  206. intentkit/skills/heurist/schema.json +196 -0
  207. intentkit/skills/lifi/README.md +294 -0
  208. intentkit/skills/lifi/__init__.py +141 -0
  209. intentkit/skills/lifi/base.py +21 -0
  210. intentkit/skills/lifi/lifi.png +0 -0
  211. intentkit/skills/lifi/schema.json +89 -0
  212. intentkit/skills/lifi/token_execute.py +472 -0
  213. intentkit/skills/lifi/token_quote.py +190 -0
  214. intentkit/skills/lifi/utils.py +656 -0
  215. intentkit/skills/moralis/README.md +490 -0
  216. intentkit/skills/moralis/__init__.py +110 -0
  217. intentkit/skills/moralis/api.py +281 -0
  218. intentkit/skills/moralis/base.py +55 -0
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
  223. intentkit/skills/moralis/moralis.png +0 -0
  224. intentkit/skills/moralis/schema.json +156 -0
  225. intentkit/skills/moralis/tests/__init__.py +0 -0
  226. intentkit/skills/moralis/tests/test_wallet.py +511 -0
  227. intentkit/skills/nation/__init__.py +62 -0
  228. intentkit/skills/nation/base.py +31 -0
  229. intentkit/skills/nation/nation.png +0 -0
  230. intentkit/skills/nation/nft_check.py +106 -0
  231. intentkit/skills/nation/schema.json +58 -0
  232. intentkit/skills/openai/__init__.py +107 -0
  233. intentkit/skills/openai/base.py +32 -0
  234. intentkit/skills/openai/dalle_image_generation.py +128 -0
  235. intentkit/skills/openai/gpt_image_generation.py +152 -0
  236. intentkit/skills/openai/gpt_image_to_image.py +186 -0
  237. intentkit/skills/openai/image_to_text.py +126 -0
  238. intentkit/skills/openai/openai.png +0 -0
  239. intentkit/skills/openai/schema.json +139 -0
  240. intentkit/skills/portfolio/README.md +55 -0
  241. intentkit/skills/portfolio/__init__.py +151 -0
  242. intentkit/skills/portfolio/base.py +107 -0
  243. intentkit/skills/portfolio/constants.py +9 -0
  244. intentkit/skills/portfolio/moralis.png +0 -0
  245. intentkit/skills/portfolio/schema.json +237 -0
  246. intentkit/skills/portfolio/token_balances.py +155 -0
  247. intentkit/skills/portfolio/wallet_approvals.py +102 -0
  248. intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
  249. intentkit/skills/portfolio/wallet_history.py +155 -0
  250. intentkit/skills/portfolio/wallet_net_worth.py +112 -0
  251. intentkit/skills/portfolio/wallet_nfts.py +139 -0
  252. intentkit/skills/portfolio/wallet_profitability.py +101 -0
  253. intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
  254. intentkit/skills/portfolio/wallet_stats.py +79 -0
  255. intentkit/skills/portfolio/wallet_swaps.py +147 -0
  256. intentkit/skills/skills.toml +103 -0
  257. intentkit/skills/slack/__init__.py +98 -0
  258. intentkit/skills/slack/base.py +55 -0
  259. intentkit/skills/slack/get_channel.py +109 -0
  260. intentkit/skills/slack/get_message.py +136 -0
  261. intentkit/skills/slack/schedule_message.py +92 -0
  262. intentkit/skills/slack/schema.json +135 -0
  263. intentkit/skills/slack/send_message.py +81 -0
  264. intentkit/skills/slack/slack.jpg +0 -0
  265. intentkit/skills/system/__init__.py +90 -0
  266. intentkit/skills/system/base.py +22 -0
  267. intentkit/skills/system/read_agent_api_key.py +87 -0
  268. intentkit/skills/system/regenerate_agent_api_key.py +77 -0
  269. intentkit/skills/system/schema.json +53 -0
  270. intentkit/skills/system/system.svg +76 -0
  271. intentkit/skills/tavily/README.md +86 -0
  272. intentkit/skills/tavily/__init__.py +91 -0
  273. intentkit/skills/tavily/base.py +27 -0
  274. intentkit/skills/tavily/schema.json +119 -0
  275. intentkit/skills/tavily/tavily.jpg +0 -0
  276. intentkit/skills/tavily/tavily_extract.py +147 -0
  277. intentkit/skills/tavily/tavily_search.py +139 -0
  278. intentkit/skills/token/README.md +89 -0
  279. intentkit/skills/token/__init__.py +107 -0
  280. intentkit/skills/token/base.py +154 -0
  281. intentkit/skills/token/constants.py +9 -0
  282. intentkit/skills/token/erc20_transfers.py +145 -0
  283. intentkit/skills/token/moralis.png +0 -0
  284. intentkit/skills/token/schema.json +141 -0
  285. intentkit/skills/token/token_analytics.py +81 -0
  286. intentkit/skills/token/token_price.py +132 -0
  287. intentkit/skills/token/token_search.py +121 -0
  288. intentkit/skills/twitter/__init__.py +146 -0
  289. intentkit/skills/twitter/base.py +68 -0
  290. intentkit/skills/twitter/follow_user.py +69 -0
  291. intentkit/skills/twitter/get_mentions.py +124 -0
  292. intentkit/skills/twitter/get_timeline.py +111 -0
  293. intentkit/skills/twitter/get_user_by_username.py +84 -0
  294. intentkit/skills/twitter/get_user_tweets.py +123 -0
  295. intentkit/skills/twitter/like_tweet.py +65 -0
  296. intentkit/skills/twitter/post_tweet.py +90 -0
  297. intentkit/skills/twitter/reply_tweet.py +98 -0
  298. intentkit/skills/twitter/retweet.py +76 -0
  299. intentkit/skills/twitter/schema.json +258 -0
  300. intentkit/skills/twitter/search_tweets.py +115 -0
  301. intentkit/skills/twitter/twitter.png +0 -0
  302. intentkit/skills/unrealspeech/__init__.py +55 -0
  303. intentkit/skills/unrealspeech/base.py +21 -0
  304. intentkit/skills/unrealspeech/schema.json +100 -0
  305. intentkit/skills/unrealspeech/text_to_speech.py +177 -0
  306. intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
  307. intentkit/skills/venice_audio/__init__.py +106 -0
  308. intentkit/skills/venice_audio/base.py +119 -0
  309. intentkit/skills/venice_audio/input.py +41 -0
  310. intentkit/skills/venice_audio/schema.json +152 -0
  311. intentkit/skills/venice_audio/venice_audio.py +240 -0
  312. intentkit/skills/venice_audio/venice_logo.jpg +0 -0
  313. intentkit/skills/venice_image/README.md +119 -0
  314. intentkit/skills/venice_image/__init__.py +154 -0
  315. intentkit/skills/venice_image/api.py +138 -0
  316. intentkit/skills/venice_image/base.py +188 -0
  317. intentkit/skills/venice_image/config.py +35 -0
  318. intentkit/skills/venice_image/image_enhance/README.md +119 -0
  319. intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
  320. intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
  321. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
  322. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
  323. intentkit/skills/venice_image/image_generation/README.md +144 -0
  324. intentkit/skills/venice_image/image_generation/__init__.py +0 -0
  325. intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
  326. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
  328. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
  329. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
  330. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
  331. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
  332. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
  333. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
  334. intentkit/skills/venice_image/image_upscale/README.md +111 -0
  335. intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
  336. intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
  337. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
  338. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
  339. intentkit/skills/venice_image/image_vision/README.md +112 -0
  340. intentkit/skills/venice_image/image_vision/__init__.py +0 -0
  341. intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
  344. intentkit/skills/venice_image/schema.json +267 -0
  345. intentkit/skills/venice_image/utils.py +78 -0
  346. intentkit/skills/venice_image/venice_image.jpg +0 -0
  347. intentkit/skills/web_scraper/README.md +82 -0
  348. intentkit/skills/web_scraper/__init__.py +92 -0
  349. intentkit/skills/web_scraper/base.py +21 -0
  350. intentkit/skills/web_scraper/langchain.png +0 -0
  351. intentkit/skills/web_scraper/schema.json +115 -0
  352. intentkit/skills/web_scraper/scrape_and_index.py +327 -0
  353. intentkit/utils/__init__.py +1 -0
  354. intentkit/utils/chain.py +436 -0
  355. intentkit/utils/error.py +134 -0
  356. intentkit/utils/logging.py +70 -0
  357. intentkit/utils/middleware.py +61 -0
  358. intentkit/utils/random.py +16 -0
  359. intentkit/utils/s3.py +267 -0
  360. intentkit/utils/slack_alert.py +79 -0
  361. intentkit/utils/tx.py +37 -0
  362. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
  363. intentkit-0.5.2.dist-info/RECORD +365 -0
  364. intentkit-0.5.0.dist-info/RECORD +0 -4
  365. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
  366. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,300 @@
1
+ from typing import Type
2
+
3
+ import httpx
4
+ from langchain.tools.base import ToolException
5
+ from langchain_core.runnables import RunnableConfig
6
+ from pydantic import BaseModel, Field
7
+
8
+ from intentkit.skills.base import SkillContext
9
+ from intentkit.skills.enso.abi.route import ABI_ROUTE
10
+ from intentkit.skills.enso.networks import EnsoGetNetworks
11
+ from intentkit.utils.tx import EvmContractWrapper
12
+
13
+ from .base import EnsoBaseTool, base_url, default_chain_id
14
+
15
+
16
+ class EnsoRouteShortcutInput(BaseModel):
17
+ """
18
+ Input model for finding best route for swap or deposit.
19
+ """
20
+
21
+ broadcast_requested: bool = Field(
22
+ False,
23
+ description="Whether to broadcast the transaction or not, this is false by default.",
24
+ )
25
+ chainId: int = Field(
26
+ default_chain_id,
27
+ 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",
28
+ )
29
+ amountIn: list[int] = Field(
30
+ description="Amount of tokenIn to swap in wei, you should multiply user's requested value by token decimals."
31
+ )
32
+ tokenIn: list[str] = Field(
33
+ description="Ethereum address of the token to swap or enter into a position from (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)."
34
+ )
35
+ tokenOut: list[str] = Field(
36
+ description="Ethereum address of the token to swap or enter into a position to (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee)."
37
+ )
38
+ # Optional inputs
39
+ # routingStrategy: Literal["router", "delegate", "ensowallet", None] = Field(
40
+ # None,
41
+ # description="(Optional) Routing strategy to use. Options: 'ensowallet', 'router', 'delegate'.",
42
+ # )
43
+ # receiver: str | None = Field(
44
+ # None, description="(Optional) Ethereum address of the receiver of the tokenOut."
45
+ # )
46
+ # spender: str | None = Field(
47
+ # None, description="(Optional) Ethereum address of the spender of the tokenIn."
48
+ # )
49
+ # amountOut: list[str] | None = Field(
50
+ # None, description="(Optional) Amount of tokenOut to receive."
51
+ # )
52
+ # minAmountOut: list[str] | None = Field(
53
+ # None,
54
+ # description="(Optional) Minimum amount out in wei. If specified, slippage should not be specified.",
55
+ # )
56
+ # slippage: str | None = Field(
57
+ # None,
58
+ # description="(Optional) Slippage in basis points (1/10000). If specified, minAmountOut should not be specified.",
59
+ # )
60
+ # fee: list[str] | None = Field(
61
+ # None,
62
+ # description="(Optional) Fee in basis points (1/10000) for each amountIn value.",
63
+ # )
64
+ # feeReceiver: str | None = Field(
65
+ # None,
66
+ # description="(Optional) Ethereum address that will receive the collected fee if fee was provided.",
67
+ # )
68
+ # disableRFQs: bool | None = Field(
69
+ # None, description="(Optional) Exclude RFQ sources from routes."
70
+ # )
71
+ # ignoreAggregators: list[str] | None = Field(
72
+ # None, description="(Optional) List of swap aggregators to ignore."
73
+ # )
74
+ # ignoreStandards: list[str] | None = Field(
75
+ # None, description="(Optional) List of standards to ignore."
76
+ # )
77
+ # variableEstimates: dict | None = Field(
78
+ # None, description="Variable estimates for the route."
79
+ # )
80
+
81
+
82
+ class Route(BaseModel):
83
+ tokenIn: list[str] | None = Field(
84
+ None,
85
+ description="Ethereum address of the token to swap or enter into a position from.",
86
+ )
87
+ tokenOut: list[str] | None = Field(
88
+ None,
89
+ description="Ethereum address of the token to swap or enter into a position to.",
90
+ )
91
+ protocol: str | None = Field(None, description="Protocol used for finding route.")
92
+ action: str | None = Field(
93
+ None, description="Action has been done for route (e.g. swap)."
94
+ )
95
+ # internalRoutes: list[str] | None = Field(
96
+ # None, description="Internal routes needed for the route."
97
+ # )
98
+
99
+
100
+ class EnsoRouteShortcutOutput(BaseModel):
101
+ """
102
+ Output model for broadcasting a transaction.
103
+ """
104
+
105
+ network: str = Field(
106
+ "The network name of the transaction.",
107
+ )
108
+ amountOut: str | dict | None = Field(
109
+ None,
110
+ description="The final calculated amountOut as an object. you should multiply its value by tokenOut decimals.",
111
+ )
112
+ priceImpact: float | None = Field(
113
+ None,
114
+ description="Price impact in basis points, it is null if USD price is not found.",
115
+ )
116
+ txHash: str | None = Field(
117
+ None, description="The transaction hash of the broadcasted transaction."
118
+ )
119
+ # gas: str | None = Field(
120
+ # None,
121
+ # description="Estimated gas amount for the transaction.",
122
+ # )
123
+ # feeAmount: list[str] | None = Field(
124
+ # None,
125
+ # description="An array of the fee amounts collected for each tokenIn.",
126
+ # )
127
+ # createdAt: int | None = Field(
128
+ # None, description="Block number the transaction was created on."
129
+ # )
130
+ # route: list[Route] | None = Field(
131
+ # None, description="Route that the shortcut will use."
132
+ # )
133
+
134
+ # def __str__(self):
135
+ # """
136
+ # Returns the summary attribute as a string.
137
+ # """
138
+ # return f"network:{self.network}, amount out: {self.amountOut}, price impact: {self.priceImpact}, tx hash: {self.txHash}"
139
+
140
+
141
+ class EnsoRouteShortcut(EnsoBaseTool):
142
+ """
143
+ This tool finds the optimal execution route path for swap or deposit across a multitude of DeFi protocols such as liquidity pools,
144
+ lending platforms, automated market makers, yield optimizers, and more. This allows for maximized capital efficiency
145
+ and yield optimization, taking into account return rates, gas costs, and slippage.
146
+
147
+ Important: the amountOut should be divided by tokenOut decimals before returning the result.
148
+
149
+ This tool is able to broadcast the transaction to the network if the user explicitly requests it. otherwise,
150
+ broadcast_requested is always false.
151
+
152
+ Deposit means to supply the underlying token to its parent token. (e.g. deposit USDC to receive aBasUSDC).
153
+
154
+ Attributes:
155
+ name (str): Name of the tool, specifically "enso_route_shortcut".
156
+ description (str): Comprehensive description of the tool's purpose and functionality.
157
+ args_schema (Type[BaseModel]): Schema for input arguments, specifying expected parameters.
158
+ """
159
+
160
+ name: str = "enso_route_shortcut"
161
+ 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."
162
+ args_schema: Type[BaseModel] = EnsoRouteShortcutInput
163
+
164
+ async def _arun(
165
+ self,
166
+ amountIn: list[int],
167
+ tokenIn: list[str],
168
+ tokenOut: list[str],
169
+ config: RunnableConfig,
170
+ chainId: int = default_chain_id,
171
+ broadcast_requested: bool = False,
172
+ **kwargs,
173
+ ) -> EnsoRouteShortcutOutput:
174
+ """
175
+ Run the tool to get swap route information.
176
+
177
+ Args:
178
+ amountIn (list[int]): Amount of tokenIn to swap in wei, you should multiply user's requested value by token decimals.
179
+ tokenIn (list[str]): Ethereum address of the token to swap or enter into a position from (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee).
180
+ tokenOut (list[str]): Ethereum address of the token to swap or enter into a position to (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee).
181
+ chainId (int): The chain id of the network to be used for swap, deposit and routing.
182
+ broadcast_requested (bool): User should ask for broadcasting the transaction explicitly, otherwise it is always false.
183
+
184
+ Returns:
185
+ EnsoRouteShortcutOutput: The response containing route shortcut information.
186
+ """
187
+
188
+ context: SkillContext = self.context_from_config(config)
189
+ agent_id = context.agent.id
190
+ api_token = self.get_api_token(context)
191
+ chain_provider = self.get_chain_provider(context)
192
+ wallet = await self.get_wallet(context)
193
+
194
+ async with httpx.AsyncClient() as client:
195
+ try:
196
+ network_name = None
197
+ networks = await self.skill_store.get_agent_skill_data(
198
+ agent_id, "enso_get_networks", "networks"
199
+ )
200
+
201
+ if networks:
202
+ network_name = (
203
+ networks.get(str(chainId)).get("name")
204
+ if networks.get(str(chainId))
205
+ else None
206
+ )
207
+ if network_name is None:
208
+ networks = await EnsoGetNetworks(
209
+ skill_store=self.skill_store,
210
+ ).arun(config)
211
+
212
+ for network in networks.res:
213
+ if network.id == chainId:
214
+ network_name = network.name
215
+
216
+ if not network_name:
217
+ raise ToolException(
218
+ f"network name not found for chainId: {chainId}"
219
+ )
220
+
221
+ headers = {
222
+ "accept": "application/json",
223
+ "Authorization": f"Bearer {api_token}",
224
+ }
225
+
226
+ token_decimals = await self.skill_store.get_agent_skill_data(
227
+ agent_id,
228
+ "enso_get_tokens",
229
+ "decimals",
230
+ )
231
+
232
+ if not token_decimals:
233
+ raise ToolException(
234
+ "there is not enough information, enso_get_tokens should be called for data, at first."
235
+ )
236
+
237
+ if not token_decimals.get(tokenOut[0]):
238
+ raise ToolException(
239
+ f"token decimals information for token {tokenOut[0]} not found"
240
+ )
241
+
242
+ if not token_decimals.get(tokenIn[0]):
243
+ raise ToolException(
244
+ f"token decimals information for token {tokenIn[0]} not found"
245
+ )
246
+
247
+ url = f"{base_url}/api/v1/shortcuts/route"
248
+
249
+ # Prepare query parameters
250
+ params = EnsoRouteShortcutInput(
251
+ chainId=chainId,
252
+ amountIn=amountIn,
253
+ tokenIn=tokenIn,
254
+ tokenOut=tokenOut,
255
+ ).model_dump(exclude_none=True)
256
+
257
+ params["fromAddress"] = wallet.addresses[0].address_id
258
+
259
+ response = await client.get(url, headers=headers, params=params)
260
+ response.raise_for_status() # Raise HTTPError for non-2xx responses
261
+ json_dict = response.json()
262
+
263
+ res = EnsoRouteShortcutOutput(**json_dict)
264
+ res.network = network_name
265
+
266
+ res.amountOut = str(
267
+ float(res.amountOut) / 10 ** token_decimals[tokenOut[0]]
268
+ )
269
+
270
+ if broadcast_requested:
271
+ rpc_url = chain_provider.get_chain_config_by_id(chainId).rpc_url
272
+ contract = EvmContractWrapper(
273
+ rpc_url, ABI_ROUTE, json_dict.get("tx")
274
+ )
275
+
276
+ fn, fn_args = contract.fn_and_args
277
+
278
+ fn_args["amountIn"] = str(fn_args["amountIn"])
279
+
280
+ invocation = wallet.invoke_contract(
281
+ contract_address=contract.dst_addr,
282
+ method=fn.fn_name,
283
+ abi=ABI_ROUTE,
284
+ args=fn_args,
285
+ ).wait()
286
+
287
+ res.txHash = invocation.transaction.transaction_hash
288
+
289
+ return res
290
+
291
+ except httpx.RequestError as req_err:
292
+ raise ToolException(
293
+ f"request error from Enso API: {req_err}"
294
+ ) from req_err
295
+ except httpx.HTTPStatusError as http_err:
296
+ raise ToolException(
297
+ f"http error from Enso API: {http_err}"
298
+ ) from http_err
299
+ except Exception as e:
300
+ raise ToolException(f"error from Enso API: {e}") from e
@@ -0,0 +1,212 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "Enso Finance",
5
+ "description": "Integration with Enso Finance API providing DeFi trading and portfolio management capabilities across multiple blockchain networks",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/enso/enso.jpg",
7
+ "x-tags": [
8
+ "Blockchain"
9
+ ],
10
+ "properties": {
11
+ "enabled": {
12
+ "type": "boolean",
13
+ "title": "Enabled",
14
+ "description": "Whether this skill is enabled",
15
+ "default": false
16
+ },
17
+ "states": {
18
+ "type": "object",
19
+ "properties": {
20
+ "get_networks": {
21
+ "type": "string",
22
+ "title": "Get Networks",
23
+ "enum": [
24
+ "disabled",
25
+ "public",
26
+ "private"
27
+ ],
28
+ "x-enum-title": [
29
+ "Disabled",
30
+ "Agent Owner + All Users",
31
+ "Agent Owner Only"
32
+ ],
33
+ "description": "Retrieve networks supported by the Enso API",
34
+ "default": "disabled"
35
+ },
36
+ "get_tokens": {
37
+ "type": "string",
38
+ "title": "Get Tokens",
39
+ "enum": [
40
+ "disabled",
41
+ "public",
42
+ "private"
43
+ ],
44
+ "x-enum-title": [
45
+ "Disabled",
46
+ "Agent Owner + All Users",
47
+ "Agent Owner Only"
48
+ ],
49
+ "description": "Enso Finance Token Information Tool: Retrieves detailed token information from the Enso Finance API, including APY, symbol, address, protocol slug, token type, and underlying tokens.",
50
+ "default": "disabled"
51
+ },
52
+ "get_prices": {
53
+ "type": "string",
54
+ "title": "Get Prices",
55
+ "enum": [
56
+ "disabled",
57
+ "public",
58
+ "private"
59
+ ],
60
+ "x-enum-title": [
61
+ "Disabled",
62
+ "Agent Owner + All Users",
63
+ "Agent Owner Only"
64
+ ],
65
+ "description": "Retrieve the price of a token by chain ID and contract address",
66
+ "default": "disabled"
67
+ },
68
+ "get_wallet_approvals": {
69
+ "type": "string",
70
+ "title": "Get Wallet Approvals",
71
+ "enum": [
72
+ "disabled",
73
+ "public",
74
+ "private"
75
+ ],
76
+ "x-enum-title": [
77
+ "Disabled",
78
+ "Agent Owner + All Users",
79
+ "Agent Owner Only"
80
+ ],
81
+ "description": "Retrieve token spend approvals for a wallet on a specified blockchain network.",
82
+ "default": "disabled"
83
+ },
84
+ "get_wallet_balances": {
85
+ "type": "string",
86
+ "title": "Get Wallet Balances",
87
+ "enum": [
88
+ "disabled",
89
+ "public",
90
+ "private"
91
+ ],
92
+ "x-enum-title": [
93
+ "Disabled",
94
+ "Agent Owner + All Users",
95
+ "Agent Owner Only"
96
+ ],
97
+ "description": "Retrieve token balances of a wallet on a specified blockchain network.",
98
+ "default": "disabled"
99
+ },
100
+ "wallet_approve": {
101
+ "type": "string",
102
+ "title": "Wallet Approve",
103
+ "enum": [
104
+ "disabled",
105
+ "public",
106
+ "private"
107
+ ],
108
+ "x-enum-title": [
109
+ "Disabled",
110
+ "Agent Owner + All Users",
111
+ "Agent Owner Only"
112
+ ],
113
+ "description": "This tool is used specifically for broadcasting a ERC20 token spending approval transaction to the network. It should only be used when the user explicitly requests to broadcast an approval transaction with a specific amount for a certain token.",
114
+ "default": "disabled"
115
+ },
116
+ "route_shortcut": {
117
+ "type": "string",
118
+ "title": "Route Shortcut",
119
+ "enum": [
120
+ "disabled",
121
+ "public",
122
+ "private"
123
+ ],
124
+ "x-enum-title": [
125
+ "Disabled",
126
+ "Agent Owner + All Users",
127
+ "Agent Owner Only"
128
+ ],
129
+ "description": "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.",
130
+ "default": "disabled"
131
+ },
132
+ "get_best_yield": {
133
+ "type": "string",
134
+ "title": "Get Best Yield",
135
+ "enum": [
136
+ "disabled",
137
+ "public",
138
+ "private"
139
+ ],
140
+ "x-enum-title": [
141
+ "Disabled",
142
+ "Agent Owner + All Users",
143
+ "Agent Owner Only"
144
+ ],
145
+ "description": "Find the best yield options for a specific token (default: USDC) across all protocols on a blockchain network (default: Base). Results are sorted by APY in descending order.",
146
+ "default": "disabled"
147
+ }
148
+ },
149
+ "description": "States for each Enso skill (disabled, public, or private)"
150
+ },
151
+ "main_tokens": {
152
+ "type": "array",
153
+ "items": {
154
+ "type": "string"
155
+ },
156
+ "description": "List of main tokens to use",
157
+ "default": [
158
+ "ETH",
159
+ "UDSC",
160
+ "USDT"
161
+ ]
162
+ },
163
+ "api_key_provider": {
164
+ "type": "string",
165
+ "title": "API Key Provider",
166
+ "description": "Provider of the API key",
167
+ "enum": [
168
+ "platform",
169
+ "agent_owner"
170
+ ],
171
+ "x-enum-title": [
172
+ "Nation Hosted",
173
+ "Owner Provided"
174
+ ],
175
+ "default": "platform"
176
+ }
177
+ },
178
+ "required": [
179
+ "states",
180
+ "main_tokens",
181
+ "enabled"
182
+ ],
183
+ "if": {
184
+ "properties": {
185
+ "api_key_provider": {
186
+ "const": "agent_owner"
187
+ }
188
+ }
189
+ },
190
+ "then": {
191
+ "properties": {
192
+ "api_token": {
193
+ "type": "string",
194
+ "title": "API Token",
195
+ "description": "Enso API token for authentication"
196
+ }
197
+ },
198
+ "if": {
199
+ "properties": {
200
+ "enabled": {
201
+ "const": true
202
+ }
203
+ }
204
+ },
205
+ "then": {
206
+ "required": [
207
+ "api_token"
208
+ ]
209
+ }
210
+ },
211
+ "additionalProperties": true
212
+ }