intentkit 0.6.13.dev2__py3-none-any.whl → 0.8.17__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (385) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +14 -7
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +5 -2
  8. intentkit/clients/cdp.py +101 -141
  9. intentkit/clients/twitter.py +83 -62
  10. intentkit/clients/web3.py +29 -0
  11. intentkit/config/config.py +8 -5
  12. intentkit/core/agent.py +472 -195
  13. intentkit/core/asset.py +253 -0
  14. intentkit/core/chat.py +51 -0
  15. intentkit/core/client.py +1 -1
  16. intentkit/core/credit.py +460 -130
  17. intentkit/core/engine.py +262 -233
  18. intentkit/core/node.py +15 -16
  19. intentkit/core/prompt.py +62 -28
  20. intentkit/core/scheduler.py +92 -0
  21. intentkit/core/statistics.py +168 -0
  22. intentkit/models/agent.py +1096 -949
  23. intentkit/models/agent_data.py +68 -38
  24. intentkit/models/agent_public.json +98 -0
  25. intentkit/models/agent_schema.json +54 -439
  26. intentkit/models/app_setting.py +96 -33
  27. intentkit/models/chat.py +74 -27
  28. intentkit/models/conversation.py +8 -8
  29. intentkit/models/credit.py +362 -74
  30. intentkit/models/db.py +26 -8
  31. intentkit/models/db_mig.py +2 -2
  32. intentkit/models/llm.csv +28 -0
  33. intentkit/models/llm.py +185 -350
  34. intentkit/models/redis.py +6 -4
  35. intentkit/models/skill.py +186 -72
  36. intentkit/models/skills.csv +174 -0
  37. intentkit/models/user.py +82 -24
  38. intentkit/skills/acolyt/__init__.py +2 -9
  39. intentkit/skills/acolyt/ask.py +3 -4
  40. intentkit/skills/acolyt/base.py +4 -9
  41. intentkit/skills/acolyt/schema.json +4 -3
  42. intentkit/skills/aixbt/__init__.py +2 -13
  43. intentkit/skills/aixbt/base.py +1 -7
  44. intentkit/skills/aixbt/projects.py +14 -15
  45. intentkit/skills/aixbt/schema.json +4 -4
  46. intentkit/skills/allora/__init__.py +2 -9
  47. intentkit/skills/allora/base.py +4 -9
  48. intentkit/skills/allora/price.py +3 -4
  49. intentkit/skills/allora/schema.json +3 -2
  50. intentkit/skills/base.py +248 -85
  51. intentkit/skills/basename/__init__.py +51 -0
  52. intentkit/skills/basename/base.py +11 -0
  53. intentkit/skills/basename/basename.svg +11 -0
  54. intentkit/skills/basename/schema.json +58 -0
  55. intentkit/skills/carv/__init__.py +115 -121
  56. intentkit/skills/carv/base.py +184 -185
  57. intentkit/skills/carv/fetch_news.py +3 -3
  58. intentkit/skills/carv/onchain_query.py +4 -4
  59. intentkit/skills/carv/schema.json +134 -137
  60. intentkit/skills/carv/token_info_and_price.py +5 -5
  61. intentkit/skills/casino/README.md +254 -0
  62. intentkit/skills/casino/__init__.py +86 -0
  63. intentkit/skills/casino/base.py +17 -0
  64. intentkit/skills/casino/casino.png +0 -0
  65. intentkit/skills/casino/deck_draw.py +127 -0
  66. intentkit/skills/casino/deck_shuffle.py +118 -0
  67. intentkit/skills/casino/dice_roll.py +100 -0
  68. intentkit/skills/casino/schema.json +77 -0
  69. intentkit/skills/casino/utils.py +107 -0
  70. intentkit/skills/cdp/__init__.py +22 -84
  71. intentkit/skills/cdp/base.py +1 -7
  72. intentkit/skills/cdp/schema.json +11 -314
  73. intentkit/skills/chainlist/__init__.py +2 -7
  74. intentkit/skills/chainlist/base.py +1 -7
  75. intentkit/skills/chainlist/chain_lookup.py +18 -18
  76. intentkit/skills/chainlist/schema.json +3 -5
  77. intentkit/skills/common/__init__.py +2 -9
  78. intentkit/skills/common/base.py +1 -7
  79. intentkit/skills/common/current_time.py +1 -2
  80. intentkit/skills/common/schema.json +2 -2
  81. intentkit/skills/cookiefun/__init__.py +6 -9
  82. intentkit/skills/cookiefun/base.py +2 -7
  83. intentkit/skills/cookiefun/get_account_details.py +7 -7
  84. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  85. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  86. intentkit/skills/cookiefun/get_sectors.py +3 -3
  87. intentkit/skills/cookiefun/schema.json +1 -3
  88. intentkit/skills/cookiefun/search_accounts.py +9 -9
  89. intentkit/skills/cryptocompare/__init__.py +7 -24
  90. intentkit/skills/cryptocompare/api.py +2 -3
  91. intentkit/skills/cryptocompare/base.py +11 -25
  92. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  93. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  94. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  95. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  96. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  97. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  98. intentkit/skills/cryptocompare/schema.json +3 -3
  99. intentkit/skills/cryptopanic/__init__.py +7 -10
  100. intentkit/skills/cryptopanic/base.py +51 -55
  101. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  102. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  103. intentkit/skills/cryptopanic/schema.json +105 -103
  104. intentkit/skills/dapplooker/__init__.py +2 -9
  105. intentkit/skills/dapplooker/base.py +4 -9
  106. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  107. intentkit/skills/dapplooker/schema.json +3 -5
  108. intentkit/skills/defillama/__init__.py +24 -74
  109. intentkit/skills/defillama/api.py +6 -9
  110. intentkit/skills/defillama/base.py +11 -21
  111. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  112. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  113. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  114. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  115. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  116. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  117. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  118. intentkit/skills/defillama/config/chains.py +1 -3
  119. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  120. intentkit/skills/defillama/schema.json +5 -1
  121. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  122. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  123. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  124. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  125. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  126. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  127. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  128. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  129. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  130. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  131. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  132. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  133. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  134. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  135. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  136. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  137. intentkit/skills/dexscreener/README.md +154 -0
  138. intentkit/skills/dexscreener/__init__.py +97 -93
  139. intentkit/skills/dexscreener/base.py +125 -133
  140. intentkit/skills/dexscreener/get_pair_info.py +158 -0
  141. intentkit/skills/dexscreener/get_token_pairs.py +165 -0
  142. intentkit/skills/dexscreener/get_tokens_info.py +212 -0
  143. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  144. intentkit/skills/dexscreener/schema.json +91 -48
  145. intentkit/skills/dexscreener/search_token.py +182 -321
  146. intentkit/skills/dexscreener/utils.py +420 -0
  147. intentkit/skills/dune_analytics/__init__.py +7 -9
  148. intentkit/skills/dune_analytics/base.py +48 -52
  149. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  150. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  151. intentkit/skills/dune_analytics/schema.json +104 -99
  152. intentkit/skills/elfa/__init__.py +5 -18
  153. intentkit/skills/elfa/base.py +10 -14
  154. intentkit/skills/elfa/mention.py +19 -21
  155. intentkit/skills/elfa/schema.json +3 -2
  156. intentkit/skills/elfa/stats.py +4 -4
  157. intentkit/skills/elfa/tokens.py +12 -12
  158. intentkit/skills/elfa/utils.py +26 -28
  159. intentkit/skills/enso/__init__.py +11 -31
  160. intentkit/skills/enso/base.py +50 -35
  161. intentkit/skills/enso/best_yield.py +16 -24
  162. intentkit/skills/enso/networks.py +6 -11
  163. intentkit/skills/enso/prices.py +11 -13
  164. intentkit/skills/enso/route.py +34 -38
  165. intentkit/skills/enso/schema.json +3 -2
  166. intentkit/skills/enso/tokens.py +29 -38
  167. intentkit/skills/enso/wallet.py +76 -191
  168. intentkit/skills/erc20/__init__.py +50 -0
  169. intentkit/skills/erc20/base.py +11 -0
  170. intentkit/skills/erc20/erc20.svg +5 -0
  171. intentkit/skills/erc20/schema.json +74 -0
  172. intentkit/skills/erc721/__init__.py +53 -0
  173. intentkit/skills/erc721/base.py +11 -0
  174. intentkit/skills/erc721/erc721.svg +5 -0
  175. intentkit/skills/erc721/schema.json +90 -0
  176. intentkit/skills/firecrawl/README.md +11 -5
  177. intentkit/skills/firecrawl/__init__.py +5 -18
  178. intentkit/skills/firecrawl/base.py +4 -11
  179. intentkit/skills/firecrawl/clear.py +4 -8
  180. intentkit/skills/firecrawl/crawl.py +19 -19
  181. intentkit/skills/firecrawl/query.py +4 -3
  182. intentkit/skills/firecrawl/schema.json +6 -8
  183. intentkit/skills/firecrawl/scrape.py +150 -40
  184. intentkit/skills/firecrawl/utils.py +50 -42
  185. intentkit/skills/github/__init__.py +2 -7
  186. intentkit/skills/github/base.py +1 -7
  187. intentkit/skills/github/github_search.py +1 -2
  188. intentkit/skills/github/schema.json +3 -4
  189. intentkit/skills/heurist/__init__.py +8 -27
  190. intentkit/skills/heurist/base.py +4 -9
  191. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  192. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  193. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  194. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  195. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  196. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  197. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  198. intentkit/skills/heurist/schema.json +2 -2
  199. intentkit/skills/http/__init__.py +4 -15
  200. intentkit/skills/http/base.py +1 -7
  201. intentkit/skills/http/get.py +21 -16
  202. intentkit/skills/http/post.py +23 -18
  203. intentkit/skills/http/put.py +23 -18
  204. intentkit/skills/http/schema.json +4 -5
  205. intentkit/skills/lifi/__init__.py +8 -13
  206. intentkit/skills/lifi/base.py +1 -7
  207. intentkit/skills/lifi/schema.json +17 -8
  208. intentkit/skills/lifi/token_execute.py +36 -30
  209. intentkit/skills/lifi/token_quote.py +8 -10
  210. intentkit/skills/lifi/utils.py +104 -51
  211. intentkit/skills/moralis/__init__.py +6 -10
  212. intentkit/skills/moralis/api.py +6 -7
  213. intentkit/skills/moralis/base.py +5 -10
  214. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  215. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  216. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  217. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  218. intentkit/skills/moralis/schema.json +7 -2
  219. intentkit/skills/morpho/__init__.py +52 -0
  220. intentkit/skills/morpho/base.py +11 -0
  221. intentkit/skills/morpho/morpho.svg +12 -0
  222. intentkit/skills/morpho/schema.json +73 -0
  223. intentkit/skills/nation/__init__.py +4 -9
  224. intentkit/skills/nation/base.py +5 -10
  225. intentkit/skills/nation/nft_check.py +3 -4
  226. intentkit/skills/nation/schema.json +4 -3
  227. intentkit/skills/onchain.py +23 -0
  228. intentkit/skills/openai/__init__.py +17 -18
  229. intentkit/skills/openai/base.py +10 -14
  230. intentkit/skills/openai/dalle_image_generation.py +3 -8
  231. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  232. intentkit/skills/openai/gpt_image_generation.py +4 -8
  233. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  234. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  235. intentkit/skills/openai/image_to_text.py +3 -7
  236. intentkit/skills/openai/schema.json +34 -3
  237. intentkit/skills/portfolio/__init__.py +11 -35
  238. intentkit/skills/portfolio/base.py +33 -19
  239. intentkit/skills/portfolio/schema.json +3 -5
  240. intentkit/skills/portfolio/token_balances.py +21 -21
  241. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  242. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  243. intentkit/skills/portfolio/wallet_history.py +31 -31
  244. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  245. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  246. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  247. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  248. intentkit/skills/portfolio/wallet_stats.py +3 -3
  249. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  250. intentkit/skills/pyth/__init__.py +50 -0
  251. intentkit/skills/pyth/base.py +11 -0
  252. intentkit/skills/pyth/pyth.svg +6 -0
  253. intentkit/skills/pyth/schema.json +75 -0
  254. intentkit/skills/skills.toml +40 -0
  255. intentkit/skills/slack/__init__.py +5 -17
  256. intentkit/skills/slack/base.py +3 -9
  257. intentkit/skills/slack/get_channel.py +8 -8
  258. intentkit/skills/slack/get_message.py +9 -9
  259. intentkit/skills/slack/schedule_message.py +5 -5
  260. intentkit/skills/slack/schema.json +2 -2
  261. intentkit/skills/slack/send_message.py +3 -5
  262. intentkit/skills/supabase/__init__.py +7 -23
  263. intentkit/skills/supabase/base.py +9 -13
  264. intentkit/skills/supabase/delete_data.py +5 -6
  265. intentkit/skills/supabase/fetch_data.py +13 -14
  266. intentkit/skills/supabase/insert_data.py +5 -6
  267. intentkit/skills/supabase/invoke_function.py +7 -8
  268. intentkit/skills/supabase/schema.json +2 -3
  269. intentkit/skills/supabase/update_data.py +7 -8
  270. intentkit/skills/supabase/upsert_data.py +5 -6
  271. intentkit/skills/superfluid/__init__.py +53 -0
  272. intentkit/skills/superfluid/base.py +11 -0
  273. intentkit/skills/superfluid/schema.json +89 -0
  274. intentkit/skills/superfluid/superfluid.svg +6 -0
  275. intentkit/skills/system/__init__.py +7 -24
  276. intentkit/skills/system/add_autonomous_task.py +10 -12
  277. intentkit/skills/system/delete_autonomous_task.py +2 -2
  278. intentkit/skills/system/edit_autonomous_task.py +14 -18
  279. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  280. intentkit/skills/system/read_agent_api_key.py +6 -4
  281. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  282. intentkit/skills/system/schema.json +6 -8
  283. intentkit/skills/tavily/__init__.py +3 -12
  284. intentkit/skills/tavily/base.py +4 -9
  285. intentkit/skills/tavily/schema.json +3 -5
  286. intentkit/skills/tavily/tavily_extract.py +2 -4
  287. intentkit/skills/tavily/tavily_search.py +4 -6
  288. intentkit/skills/token/__init__.py +5 -10
  289. intentkit/skills/token/base.py +7 -11
  290. intentkit/skills/token/erc20_transfers.py +19 -19
  291. intentkit/skills/token/schema.json +3 -6
  292. intentkit/skills/token/token_analytics.py +3 -3
  293. intentkit/skills/token/token_price.py +13 -13
  294. intentkit/skills/token/token_search.py +9 -9
  295. intentkit/skills/twitter/__init__.py +11 -35
  296. intentkit/skills/twitter/base.py +23 -35
  297. intentkit/skills/twitter/follow_user.py +3 -7
  298. intentkit/skills/twitter/get_mentions.py +6 -13
  299. intentkit/skills/twitter/get_timeline.py +5 -13
  300. intentkit/skills/twitter/get_user_by_username.py +3 -7
  301. intentkit/skills/twitter/get_user_tweets.py +6 -14
  302. intentkit/skills/twitter/like_tweet.py +3 -7
  303. intentkit/skills/twitter/post_tweet.py +23 -12
  304. intentkit/skills/twitter/reply_tweet.py +21 -12
  305. intentkit/skills/twitter/retweet.py +3 -7
  306. intentkit/skills/twitter/schema.json +1 -0
  307. intentkit/skills/twitter/search_tweets.py +5 -13
  308. intentkit/skills/unrealspeech/__init__.py +2 -7
  309. intentkit/skills/unrealspeech/base.py +2 -8
  310. intentkit/skills/unrealspeech/schema.json +2 -5
  311. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  312. intentkit/skills/venice_audio/__init__.py +98 -106
  313. intentkit/skills/venice_audio/base.py +117 -121
  314. intentkit/skills/venice_audio/input.py +41 -41
  315. intentkit/skills/venice_audio/schema.json +151 -152
  316. intentkit/skills/venice_audio/venice_audio.py +38 -21
  317. intentkit/skills/venice_image/__init__.py +147 -154
  318. intentkit/skills/venice_image/api.py +138 -138
  319. intentkit/skills/venice_image/base.py +185 -192
  320. intentkit/skills/venice_image/config.py +33 -35
  321. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  322. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  323. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  324. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  325. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  326. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  328. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  329. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  330. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  332. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  333. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  334. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  335. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  336. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  337. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  338. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  339. intentkit/skills/venice_image/schema.json +267 -267
  340. intentkit/skills/venice_image/utils.py +77 -78
  341. intentkit/skills/web_scraper/__init__.py +5 -18
  342. intentkit/skills/web_scraper/base.py +21 -7
  343. intentkit/skills/web_scraper/document_indexer.py +7 -6
  344. intentkit/skills/web_scraper/schema.json +2 -6
  345. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  346. intentkit/skills/web_scraper/utils.py +62 -63
  347. intentkit/skills/web_scraper/website_indexer.py +17 -19
  348. intentkit/skills/weth/__init__.py +49 -0
  349. intentkit/skills/weth/base.py +11 -0
  350. intentkit/skills/weth/schema.json +58 -0
  351. intentkit/skills/weth/weth.svg +6 -0
  352. intentkit/skills/wow/__init__.py +51 -0
  353. intentkit/skills/wow/base.py +11 -0
  354. intentkit/skills/wow/schema.json +89 -0
  355. intentkit/skills/wow/wow.svg +7 -0
  356. intentkit/skills/x402/__init__.py +61 -0
  357. intentkit/skills/x402/ask_agent.py +98 -0
  358. intentkit/skills/x402/base.py +99 -0
  359. intentkit/skills/x402/http_request.py +117 -0
  360. intentkit/skills/x402/schema.json +45 -0
  361. intentkit/skills/x402/x402.webp +0 -0
  362. intentkit/skills/xmtp/__init__.py +4 -15
  363. intentkit/skills/xmtp/base.py +61 -2
  364. intentkit/skills/xmtp/price.py +18 -13
  365. intentkit/skills/xmtp/schema.json +69 -71
  366. intentkit/skills/xmtp/swap.py +22 -25
  367. intentkit/skills/xmtp/transfer.py +71 -32
  368. intentkit/utils/chain.py +3 -3
  369. intentkit/utils/error.py +14 -1
  370. intentkit/utils/logging.py +2 -4
  371. intentkit/utils/s3.py +59 -7
  372. intentkit/utils/schema.py +100 -0
  373. intentkit/utils/slack_alert.py +7 -8
  374. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
  375. intentkit-0.8.17.dist-info/RECORD +466 -0
  376. intentkit/abstracts/exception.py +0 -9
  377. intentkit/core/skill.py +0 -200
  378. intentkit/models/generator.py +0 -347
  379. intentkit/skills/cdp/get_balance.py +0 -110
  380. intentkit/skills/cdp/swap.py +0 -121
  381. intentkit/skills/moralis/tests/__init__.py +0 -0
  382. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  383. intentkit-0.6.13.dev2.dist-info/RECORD +0 -409
  384. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  385. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,212 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ from pydantic import BaseModel, Field, ValidationError, field_validator
5
+
6
+ from intentkit.skills.dexscreener.base import DexScreenerBaseTool
7
+ from intentkit.skills.dexscreener.model.search_token_response import (
8
+ SearchTokenResponseModel,
9
+ )
10
+ from intentkit.skills.dexscreener.utils import (
11
+ API_ENDPOINTS,
12
+ MAX_TOKENS_BATCH,
13
+ RATE_LIMITS,
14
+ create_error_response,
15
+ create_no_results_response,
16
+ format_success_response,
17
+ get_liquidity_value,
18
+ group_pairs_by_token,
19
+ handle_validation_error,
20
+ truncate_large_fields,
21
+ )
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class GetTokensInfoInput(BaseModel):
27
+ """Input schema for the DexScreener get_tokens_info tool."""
28
+
29
+ chain_id: str = Field(
30
+ description="The blockchain chain ID (e.g., 'ethereum', 'solana', 'bsc', 'polygon', 'arbitrum', 'base', 'avalanche')"
31
+ )
32
+ token_addresses: list[str] = Field(
33
+ description=f"List of token contract addresses to retrieve info for (maximum {MAX_TOKENS_BATCH} addresses). "
34
+ "Each address should be in the format '0x1234...abcd' for Ethereum-based chains."
35
+ )
36
+
37
+ @field_validator("token_addresses")
38
+ @classmethod
39
+ def validate_token_addresses(cls, v: list[str]) -> list[str]:
40
+ if not v:
41
+ raise ValueError("At least one token address is required")
42
+ if len(v) > MAX_TOKENS_BATCH:
43
+ raise ValueError(f"Maximum {MAX_TOKENS_BATCH} token addresses allowed")
44
+ # Remove duplicates while preserving order
45
+ seen = set()
46
+ unique_addresses = []
47
+ for addr in v:
48
+ if addr not in seen:
49
+ seen.add(addr)
50
+ unique_addresses.append(addr)
51
+ return unique_addresses
52
+
53
+
54
+ class GetTokensInfo(DexScreenerBaseTool):
55
+ """
56
+ Tool to get detailed information for multiple tokens at once on DexScreener.
57
+ """
58
+
59
+ name: str = "dexscreener_get_tokens_info"
60
+ description: str = (
61
+ f"Retrieves detailed trading pair information for multiple tokens (up to {MAX_TOKENS_BATCH}) "
62
+ "using chain ID and a list of token addresses. For each token, returns all available "
63
+ "trading pairs with price, volume, liquidity, market data, and DEX information. "
64
+ "This is more efficient than making individual calls when you need info for multiple tokens. "
65
+ "Use this tool for portfolio analysis or comparing multiple tokens at once."
66
+ )
67
+ args_schema: type[BaseModel] = GetTokensInfoInput
68
+
69
+ async def _arun(
70
+ self,
71
+ chain_id: str,
72
+ token_addresses: list[str],
73
+ **kwargs: Any,
74
+ ) -> str:
75
+ """Implementation to get information for multiple tokens."""
76
+
77
+ # Apply rate limiting
78
+ await self.global_rate_limit_by_skill(
79
+ limit=RATE_LIMITS["tokens"],
80
+ seconds=60,
81
+ )
82
+
83
+ logger.info(
84
+ f"Executing DexScreener get_tokens_info tool with chain_id: '{chain_id}', "
85
+ f"token_addresses: {len(token_addresses)} tokens"
86
+ )
87
+
88
+ try:
89
+ # Construct API path - addresses are comma-separated
90
+ addresses_param = ",".join(token_addresses)
91
+ api_path = f"{API_ENDPOINTS['tokens']}/{chain_id}/{addresses_param}"
92
+
93
+ data, error_details = await self._get(path=api_path)
94
+
95
+ if error_details:
96
+ return await self._handle_error_response(error_details)
97
+
98
+ if not data:
99
+ logger.error(f"No data returned for tokens on {chain_id}")
100
+ return create_error_response(
101
+ error_type="empty_success",
102
+ message="API call returned empty success response.",
103
+ additional_data={
104
+ "chain_id": chain_id,
105
+ "token_addresses": token_addresses,
106
+ },
107
+ )
108
+
109
+ try:
110
+ # Validate response using SearchTokenResponseModel since API returns similar structure
111
+ result = SearchTokenResponseModel.model_validate(data)
112
+ except ValidationError as e:
113
+ return handle_validation_error(
114
+ e, f"{chain_id}/{len(token_addresses)} tokens", len(str(data))
115
+ )
116
+
117
+ if not result.pairs:
118
+ return create_no_results_response(
119
+ f"{chain_id} - {len(token_addresses)} tokens",
120
+ reason="no trading pairs found for any of the specified tokens",
121
+ additional_data={
122
+ "chain_id": chain_id,
123
+ "requested_addresses": token_addresses,
124
+ "tokens_data": {},
125
+ "all_pairs": [],
126
+ "found_tokens": 0,
127
+ "total_pairs": 0,
128
+ },
129
+ )
130
+
131
+ pairs_list = [p for p in result.pairs if p is not None]
132
+
133
+ if not pairs_list:
134
+ return create_no_results_response(
135
+ f"{chain_id} - {len(token_addresses)} tokens",
136
+ reason="all pairs were null or invalid",
137
+ additional_data={
138
+ "chain_id": chain_id,
139
+ "requested_addresses": token_addresses,
140
+ "tokens_data": {},
141
+ "all_pairs": [],
142
+ "found_tokens": 0,
143
+ "total_pairs": 0,
144
+ },
145
+ )
146
+
147
+ # Group pairs by token address for better organization
148
+ tokens_data = group_pairs_by_token(pairs_list)
149
+
150
+ # Sort pairs within each token by liquidity (highest first)
151
+ for token_addr, pairs in tokens_data.items():
152
+ try:
153
+ pairs.sort(key=get_liquidity_value, reverse=True)
154
+ except Exception as sort_err:
155
+ logger.warning(
156
+ f"Failed to sort pairs for token {token_addr}: {sort_err}"
157
+ )
158
+
159
+ logger.info(
160
+ f"Found {len(pairs_list)} total pairs across {len(tokens_data)} tokens "
161
+ f"for {len(token_addresses)} requested addresses on {chain_id}"
162
+ )
163
+
164
+ return format_success_response(
165
+ {
166
+ "tokens_data": {
167
+ addr: [p.model_dump() for p in pairs]
168
+ for addr, pairs in tokens_data.items()
169
+ },
170
+ "all_pairs": [p.model_dump() for p in pairs_list],
171
+ "chain_id": chain_id,
172
+ "requested_addresses": token_addresses,
173
+ "found_tokens": len(tokens_data),
174
+ "total_pairs": len(pairs_list),
175
+ }
176
+ )
177
+
178
+ except Exception as e:
179
+ return await self._handle_unexpected_runtime_error(
180
+ e, f"{chain_id}/{len(token_addresses)} tokens"
181
+ )
182
+
183
+ async def _handle_error_response(self, error_details: dict) -> str:
184
+ """Formats error details (from _get) into a JSON string."""
185
+ if error_details.get("error_type") in [
186
+ "connection_error",
187
+ "parsing_error",
188
+ "unexpected_error",
189
+ ]:
190
+ logger.error(
191
+ f"DexScreener get_tokens_info tool encountered an error: {error_details}"
192
+ )
193
+ else: # api_error
194
+ logger.warning(f"DexScreener API returned an error: {error_details}")
195
+
196
+ # Truncate potentially large fields before returning to user/LLM
197
+ truncated_details = truncate_large_fields(error_details)
198
+ return format_success_response(truncated_details)
199
+
200
+ async def _handle_unexpected_runtime_error(
201
+ self, e: Exception, query_info: str
202
+ ) -> str:
203
+ """Formats unexpected runtime exception details into a JSON string."""
204
+ logger.exception(
205
+ f"An unexpected runtime error occurred in get_tokens_info tool _arun method for {query_info}: {e}"
206
+ )
207
+ return create_error_response(
208
+ error_type="runtime_error",
209
+ message="An unexpected internal error occurred processing the tokens info request",
210
+ details=str(e),
211
+ additional_data={"query_info": query_info},
212
+ )
@@ -1,82 +1,80 @@
1
- from typing import List, Optional
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class TokenModel(BaseModel):
7
- address: Optional[str] = None
8
- name: Optional[str] = None
9
- symbol: Optional[str] = None
10
-
11
-
12
- class TxnsDetailsModel(BaseModel):
13
- buys: Optional[int] = None
14
- sells: Optional[int] = None
15
-
16
-
17
- class TxnsModel(BaseModel):
18
- m5: Optional[TxnsDetailsModel] = None
19
- h1: Optional[TxnsDetailsModel] = None
20
- h6: Optional[TxnsDetailsModel] = None
21
- h24: Optional[TxnsDetailsModel] = None
22
-
23
-
24
- class VolumeModel(BaseModel):
25
- h24: Optional[float] = None
26
- h6: Optional[float] = None
27
- h1: Optional[float] = None
28
- m5: Optional[float] = None
29
-
30
-
31
- class PriceChangeModel(BaseModel):
32
- m5: Optional[float] = None
33
- h1: Optional[float] = None
34
- h6: Optional[float] = None
35
- h24: Optional[float] = None
36
-
37
-
38
- class LiquidityModel(BaseModel):
39
- usd: Optional[float] = None
40
- base: Optional[float] = None
41
- quote: Optional[float] = None
42
-
43
-
44
- class WebsiteModel(BaseModel):
45
- label: Optional[str] = None
46
- url: Optional[str] = None
47
-
48
-
49
- class SocialModel(BaseModel):
50
- type: Optional[str] = None
51
- url: Optional[str] = None
52
-
53
-
54
- class InfoModel(BaseModel):
55
- imageUrl: Optional[str] = None
56
- websites: Optional[List[Optional[WebsiteModel]]] = None
57
- socials: Optional[List[Optional[SocialModel]]] = None
58
-
59
-
60
- class PairModel(BaseModel):
61
- chainId: Optional[str] = None
62
- dexId: Optional[str] = None
63
- url: Optional[str] = None
64
- pairAddress: Optional[str] = None
65
- labels: Optional[List[Optional[str]]] = None
66
- baseToken: Optional[TokenModel] = None
67
- quoteToken: Optional[TokenModel] = None
68
- priceNative: Optional[str] = None
69
- priceUsd: Optional[str] = None
70
- txns: Optional[TxnsModel] = None
71
- volume: Optional[VolumeModel] = None
72
- priceChange: Optional[PriceChangeModel] = None
73
- liquidity: Optional[LiquidityModel] = None
74
- fdv: Optional[float] = None
75
- marketCap: Optional[float] = None
76
- pairCreatedAt: Optional[int] = None
77
- info: Optional[InfoModel] = None
78
-
79
-
80
- class SearchTokenResponseModel(BaseModel):
81
- schemaVersion: Optional[str] = None
82
- pairs: Optional[List[Optional[PairModel]]] = None
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class TokenModel(BaseModel):
5
+ address: str | None = None
6
+ name: str | None = None
7
+ symbol: str | None = None
8
+
9
+
10
+ class TxnsDetailsModel(BaseModel):
11
+ buys: int | None = None
12
+ sells: int | None = None
13
+
14
+
15
+ class TxnsModel(BaseModel):
16
+ m5: TxnsDetailsModel | None = None
17
+ h1: TxnsDetailsModel | None = None
18
+ h6: TxnsDetailsModel | None = None
19
+ h24: TxnsDetailsModel | None = None
20
+
21
+
22
+ class VolumeModel(BaseModel):
23
+ h24: float | None = None
24
+ h6: float | None = None
25
+ h1: float | None = None
26
+ m5: float | None = None
27
+
28
+
29
+ class PriceChangeModel(BaseModel):
30
+ m5: float | None = None
31
+ h1: float | None = None
32
+ h6: float | None = None
33
+ h24: float | None = None
34
+
35
+
36
+ class LiquidityModel(BaseModel):
37
+ usd: float | None = None
38
+ base: float | None = None
39
+ quote: float | None = None
40
+
41
+
42
+ class WebsiteModel(BaseModel):
43
+ label: str | None = None
44
+ url: str | None = None
45
+
46
+
47
+ class SocialModel(BaseModel):
48
+ type: str | None = None
49
+ url: str | None = None
50
+
51
+
52
+ class InfoModel(BaseModel):
53
+ imageUrl: str | None = None
54
+ websites: list[WebsiteModel | None] | None = None
55
+ socials: list[SocialModel | None] | None = None
56
+
57
+
58
+ class PairModel(BaseModel):
59
+ chainId: str | None = None
60
+ dexId: str | None = None
61
+ url: str | None = None
62
+ pairAddress: str | None = None
63
+ labels: list[str | None] | None = None
64
+ baseToken: TokenModel | None = None
65
+ quoteToken: TokenModel | None = None
66
+ priceNative: str | None = None
67
+ priceUsd: str | None = None
68
+ txns: TxnsModel | None = None
69
+ volume: VolumeModel | None = None
70
+ priceChange: PriceChangeModel | None = None
71
+ liquidity: LiquidityModel | None = None
72
+ fdv: float | None = None
73
+ marketCap: float | None = None
74
+ pairCreatedAt: int | None = None
75
+ info: InfoModel | None = None
76
+
77
+
78
+ class SearchTokenResponseModel(BaseModel):
79
+ schemaVersion: str | None = None
80
+ pairs: list[PairModel | None] | None = None
@@ -1,48 +1,91 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "title": "Dexscreener",
4
- "description": "Integration with DexScreener API, enabling crypto token pair information",
5
- "type": "object",
6
- "x-icon": "https://ai.service.crestal.dev/skills/dexscreener/dexscreener.png",
7
- "x-tags": [
8
- "Crypto",
9
- "Market Data",
10
- "Finance",
11
- "Blockchain"
12
- ],
13
- "properties": {
14
- "enabled": {
15
- "type": "boolean",
16
- "title": "Enabled",
17
- "description": "Enable or disable the Dexscreener skill.",
18
- "default": false
19
- },
20
- "states": {
21
- "type": "object",
22
- "title": "Skill States",
23
- "description": "Enable/disable specific tools. Only enable one if you want a consistent characteristic for your agent",
24
- "properties": {
25
- "search_token": {
26
- "type": "string",
27
- "enum": [
28
- "disabled",
29
- "public",
30
- "private"
31
- ],
32
- "x-enum-title": [
33
- "Disabled",
34
- "Agent Owner + All Users",
35
- "Agent Owner Only"
36
- ],
37
- "description": "Searches on DexScreener for token pairs matching a query (symbol, name, address). Returns up to 50 pairs sorted by 'liquidity' or 'volume24h' (required input), including price, volume, etc. Use this tool to find token information based on user queries.",
38
- "default": "disabled"
39
- }
40
- }
41
- }
42
- },
43
- "required": [
44
- "enabled",
45
- "states"
46
- ],
47
- "additionalProperties": true
48
- }
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Dexscreener",
4
+ "description": "Integration with DexScreener API, enabling crypto token pair information",
5
+ "type": "object",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/dexscreener/dexscreener.png",
7
+ "x-tags": [
8
+ "Analytics",
9
+ "DeFi"
10
+ ],
11
+ "properties": {
12
+ "enabled": {
13
+ "type": "boolean",
14
+ "title": "Enabled",
15
+ "description": "Enable or disable the Dexscreener skill.",
16
+ "default": false
17
+ },
18
+ "states": {
19
+ "type": "object",
20
+ "title": "Skill States",
21
+ "description": "Enable/disable specific tools. Only enable one if you want a consistent characteristic for your agent",
22
+ "properties": {
23
+ "search_token": {
24
+ "type": "string",
25
+ "enum": [
26
+ "disabled",
27
+ "public",
28
+ "private"
29
+ ],
30
+ "x-enum-title": [
31
+ "Disabled",
32
+ "Agent Owner + All Users",
33
+ "Agent Owner Only"
34
+ ],
35
+ "description": "Searches on DexScreener for token pairs matching a query (symbol, name, address). Returns up to 25 pairs sorted by 'liquidity' or 'volume' with timeframe options, including price, volume, etc. Use this tool to find token information based on user queries.",
36
+ "default": "disabled"
37
+ },
38
+ "get_pair_info": {
39
+ "type": "string",
40
+ "enum": [
41
+ "disabled",
42
+ "public",
43
+ "private"
44
+ ],
45
+ "x-enum-title": [
46
+ "Disabled",
47
+ "Agent Owner + All Users",
48
+ "Agent Owner Only"
49
+ ],
50
+ "description": "Retrieves detailed information about a specific trading pair using chain ID and pair address. Returns comprehensive data including current price, volume, liquidity, price changes, market cap, FDV, transaction counts, and social links.",
51
+ "default": "disabled"
52
+ },
53
+ "get_token_pairs": {
54
+ "type": "string",
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": "Finds all trading pairs for a specific token using chain ID and token address. Returns a list of all pools/pairs where this token is traded, including pair addresses, DEX information, liquidity, volume, and pricing data for each pair.",
66
+ "default": "disabled"
67
+ },
68
+ "get_tokens_info": {
69
+ "type": "string",
70
+ "enum": [
71
+ "disabled",
72
+ "public",
73
+ "private"
74
+ ],
75
+ "x-enum-title": [
76
+ "Disabled",
77
+ "Agent Owner + All Users",
78
+ "Agent Owner Only"
79
+ ],
80
+ "description": "Retrieves detailed trading pair information for multiple tokens (up to 30) using chain ID and a list of token addresses. More efficient than making individual calls when you need info for multiple tokens. Use for portfolio analysis or comparing multiple tokens at once.",
81
+ "default": "disabled"
82
+ }
83
+ }
84
+ }
85
+ },
86
+ "required": [
87
+ "enabled",
88
+ "states"
89
+ ],
90
+ "additionalProperties": true
91
+ }