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,253 @@
1
+ """Shared asset retrieval utilities for agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import logging
7
+ from decimal import Decimal
8
+
9
+ import httpx
10
+ from pydantic import BaseModel, Field
11
+ from sqlalchemy import update
12
+ from web3 import Web3
13
+
14
+ from intentkit.clients.web3 import get_web3_client
15
+ from intentkit.config.config import config
16
+ from intentkit.models.agent import Agent, AgentTable
17
+ from intentkit.models.agent_data import AgentData
18
+ from intentkit.models.db import get_session
19
+ from intentkit.models.redis import get_redis
20
+ from intentkit.utils.error import IntentKitAPIError
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ # USDC contract addresses for different networks
25
+ USDC_ADDRESSES = {
26
+ "base-mainnet": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
27
+ "ethereum-mainnet": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
28
+ "arbitrum-mainnet": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
29
+ "optimism-mainnet": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
30
+ "polygon-mainnet": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
31
+ }
32
+
33
+ # NATION token address for base-mainnet
34
+ NATION_ADDRESS = "0x2f74f818e81685c8086dd783837a4605a90474b8"
35
+
36
+
37
+ class Asset(BaseModel):
38
+ """Model for individual asset with symbol and balance."""
39
+
40
+ symbol: str = Field(description="Asset symbol (e.g., ETH, USDC, NATION)")
41
+ balance: Decimal = Field(description="Asset balance as decimal")
42
+
43
+
44
+ class AgentAssets(BaseModel):
45
+ """Simplified agent asset response with wallet net worth and tokens."""
46
+
47
+ net_worth: str = Field(description="Total wallet net worth in USD")
48
+ tokens: list[Asset] = Field(description="List of assets with symbol and balance")
49
+
50
+
51
+ async def _get_token_balance(
52
+ web3_client: Web3, wallet_address: str, token_address: str
53
+ ) -> Decimal:
54
+ """Get ERC-20 token balance for a wallet address."""
55
+ try:
56
+ # ERC-20 standard ABI for balanceOf and decimals
57
+ erc20_abi = [
58
+ {
59
+ "constant": True,
60
+ "inputs": [{"name": "_owner", "type": "address"}],
61
+ "name": "balanceOf",
62
+ "outputs": [{"name": "balance", "type": "uint256"}],
63
+ "type": "function",
64
+ },
65
+ {
66
+ "constant": True,
67
+ "inputs": [],
68
+ "name": "decimals",
69
+ "outputs": [{"name": "", "type": "uint8"}],
70
+ "type": "function",
71
+ },
72
+ ]
73
+
74
+ contract = web3_client.eth.contract(
75
+ address=web3_client.to_checksum_address(token_address), abi=erc20_abi
76
+ )
77
+
78
+ balance_wei = contract.functions.balanceOf(
79
+ web3_client.to_checksum_address(wallet_address)
80
+ ).call()
81
+ decimals = contract.functions.decimals().call()
82
+
83
+ # Convert from wei to token units using actual decimals
84
+ balance = Decimal(balance_wei) / Decimal(10**decimals)
85
+ return balance
86
+ except Exception as exc: # pragma: no cover - log path only
87
+ logger.error("Error getting token balance: %s", exc)
88
+ return Decimal("0")
89
+
90
+
91
+ async def _get_eth_balance(web3_client: Web3, wallet_address: str) -> Decimal:
92
+ """Get ETH balance for a wallet address."""
93
+ try:
94
+ balance_wei = web3_client.eth.get_balance(
95
+ web3_client.to_checksum_address(wallet_address)
96
+ )
97
+ balance = Decimal(balance_wei) / Decimal(10**18)
98
+ return balance
99
+ except Exception as exc: # pragma: no cover - log path only
100
+ logger.error("Error getting ETH balance: %s", exc)
101
+ return Decimal("0")
102
+
103
+
104
+ async def _get_wallet_net_worth(wallet_address: str) -> str:
105
+ """Get wallet net worth using Moralis API."""
106
+ try:
107
+ async with httpx.AsyncClient() as client:
108
+ url = (
109
+ "https://deep-index.moralis.io/api/v2.2/wallets/"
110
+ f"{wallet_address}/net-worth"
111
+ )
112
+ headers = {
113
+ "accept": "application/json",
114
+ "X-API-Key": config.moralis_api_key,
115
+ }
116
+ params = {
117
+ "exclude_spam": "true",
118
+ "exclude_unverified_contracts": "true",
119
+ "chains": ["eth", "base", "polygon", "arbitrum", "optimism"],
120
+ }
121
+
122
+ response = await client.get(url, headers=headers, params=params)
123
+ response.raise_for_status()
124
+ data = response.json()
125
+ return data.get("total_networth_usd", "0")
126
+ except Exception as exc: # pragma: no cover - log path only
127
+ logger.error("Error getting wallet net worth for %s: %s", wallet_address, exc)
128
+ return "0"
129
+
130
+
131
+ async def _build_assets_list(
132
+ agent: Agent, agent_data: AgentData, web3_client: Web3
133
+ ) -> list[Asset]:
134
+ """Build the assets list based on network conditions and agent configuration."""
135
+ assets: list[Asset] = []
136
+
137
+ if not agent_data or not agent_data.evm_wallet_address:
138
+ return assets
139
+
140
+ wallet_address = agent_data.evm_wallet_address
141
+ network_id: str | None = agent.network_id
142
+
143
+ # ETH is always included
144
+ eth_balance = await _get_eth_balance(web3_client, wallet_address)
145
+ assets.append(Asset(symbol="ETH", balance=eth_balance))
146
+
147
+ if network_id and network_id.endswith("-mainnet"):
148
+ usdc_address = USDC_ADDRESSES.get(str(network_id))
149
+ if usdc_address:
150
+ usdc_balance = await _get_token_balance(
151
+ web3_client, wallet_address, usdc_address
152
+ )
153
+ assets.append(Asset(symbol="USDC", balance=usdc_balance))
154
+
155
+ if network_id == "base-mainnet":
156
+ nation_balance = await _get_token_balance(
157
+ web3_client, wallet_address, NATION_ADDRESS
158
+ )
159
+ assets.append(Asset(symbol="NATION", balance=nation_balance))
160
+
161
+ if agent.ticker and agent.token_address:
162
+ lower_addresses = [addr.lower() for addr in USDC_ADDRESSES.values()]
163
+ is_usdc = agent.token_address.lower() in lower_addresses
164
+ is_nation = agent.token_address.lower() == NATION_ADDRESS.lower()
165
+
166
+ if not is_usdc and not is_nation:
167
+ custom_balance = await _get_token_balance(
168
+ web3_client, wallet_address, agent.token_address
169
+ )
170
+ assets.append(Asset(symbol=agent.ticker, balance=custom_balance))
171
+
172
+ return assets
173
+
174
+
175
+ async def agent_asset(agent_id: str) -> AgentAssets:
176
+ """Fetch wallet net worth and token balances for an agent."""
177
+
178
+ cache_key = f"intentkit:agent_assets:{agent_id}"
179
+ redis_client = None
180
+
181
+ try:
182
+ redis_client = get_redis()
183
+ except Exception as exc: # pragma: no cover - best effort fallback
184
+ logger.debug("Redis unavailable for agent assets: %s", exc)
185
+
186
+ agent = await Agent.get(agent_id)
187
+ if not agent:
188
+ raise IntentKitAPIError(404, "AgentNotFound", "Agent not found")
189
+
190
+ if redis_client:
191
+ try:
192
+ cached_raw = await redis_client.get(cache_key)
193
+ if cached_raw:
194
+ cached_data = json.loads(cached_raw)
195
+ cached_assets = AgentAssets.model_validate(cached_data)
196
+ return cached_assets
197
+ except Exception as exc: # pragma: no cover - cache read path only
198
+ logger.debug("Failed to read agent asset cache for %s: %s", agent_id, exc)
199
+
200
+ agent_data = await AgentData.get(agent_id)
201
+ if not agent_data or not agent_data.evm_wallet_address:
202
+ assets_result = AgentAssets(net_worth="0", tokens=[])
203
+ elif not agent.network_id:
204
+ assets_result = AgentAssets(net_worth="0", tokens=[])
205
+ else:
206
+ try:
207
+ web3_client = get_web3_client(str(agent.network_id))
208
+ tokens = await _build_assets_list(agent, agent_data, web3_client)
209
+ net_worth = await _get_wallet_net_worth(agent_data.evm_wallet_address)
210
+ assets_result = AgentAssets(net_worth=net_worth, tokens=tokens)
211
+ except IntentKitAPIError:
212
+ raise
213
+ except Exception as exc:
214
+ logger.error("Error getting agent assets for %s: %s", agent_id, exc)
215
+ raise IntentKitAPIError(
216
+ 500, "AgentAssetError", "Failed to retrieve agent assets"
217
+ ) from exc
218
+
219
+ assets_payload = assets_result.model_dump(mode="json")
220
+
221
+ if redis_client:
222
+ try:
223
+ await redis_client.set(
224
+ cache_key,
225
+ json.dumps(assets_payload),
226
+ ex=3600,
227
+ )
228
+ except Exception as exc: # pragma: no cover - cache write path only
229
+ logger.debug("Failed to write agent asset cache for %s: %s", agent_id, exc)
230
+
231
+ try:
232
+ async with get_session() as session:
233
+ await session.execute(
234
+ update(AgentTable)
235
+ .where(AgentTable.id == agent_id)
236
+ .values(assets=assets_payload)
237
+ )
238
+ await session.commit()
239
+ except Exception as exc: # pragma: no cover - db persistence path only
240
+ logger.error("Error updating agent assets cache for %s: %s", agent_id, exc)
241
+
242
+ return assets_result
243
+
244
+
245
+ __all__ = [
246
+ "Asset",
247
+ "AgentAssets",
248
+ "USDC_ADDRESSES",
249
+ "NATION_ADDRESS",
250
+ "agent_asset",
251
+ "_build_assets_list",
252
+ "_get_wallet_net_worth",
253
+ ]
intentkit/core/chat.py ADDED
@@ -0,0 +1,51 @@
1
+ """Chat memory management utilities.
2
+
3
+ This module provides functions for managing chat thread memory,
4
+ including clearing thread history using LangGraph's checkpointer.
5
+ """
6
+
7
+ import logging
8
+
9
+ from intentkit.models.db import get_langgraph_checkpointer
10
+ from intentkit.utils.error import IntentKitAPIError
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ async def clear_thread_memory(agent_id: str, chat_id: str) -> bool:
16
+ """Clear all memory content for a specific thread.
17
+
18
+ This function uses LangGraph's official checkpointer.delete_thread() method
19
+ to permanently remove all stored checkpoints and conversation history
20
+ associated with the specified thread.
21
+
22
+ Args:
23
+ agent_id (str): The agent identifier
24
+ chat_id (str): The chat identifier
25
+
26
+ Returns:
27
+ bool: True if the thread memory was successfully cleared
28
+
29
+ Raises:
30
+ IntentKitAPIError: If there's an error clearing the thread memory
31
+ """
32
+ try:
33
+ # Construct thread_id by combining agent_id and chat_id
34
+ thread_id = f"{agent_id}-{chat_id}"
35
+
36
+ # Get the LangGraph checkpointer instance
37
+ checkpointer = get_langgraph_checkpointer()
38
+
39
+ # Use the official LangGraph method to delete all thread content
40
+ await checkpointer.adelete_thread(thread_id)
41
+
42
+ logger.info(f"Successfully cleared thread memory for thread_id: {thread_id}")
43
+ return True
44
+
45
+ except Exception as e:
46
+ logger.error(
47
+ f"Failed to clear thread memory for agent_id: {agent_id}, chat_id: {chat_id}. Error: {str(e)}"
48
+ )
49
+ raise IntentKitAPIError(
50
+ status_code=500, key="ServerError", message="Failed to clear thread memory"
51
+ )
intentkit/core/client.py CHANGED
@@ -3,7 +3,7 @@
3
3
  This module provides client functions for core API endpoints with environment-aware routing.
4
4
  """
5
5
 
6
- from typing import AsyncIterator
6
+ from collections.abc import AsyncIterator
7
7
 
8
8
  import httpx
9
9