intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. intentkit/MANIFEST.in +14 -0
  2. intentkit/README.md +88 -0
  3. intentkit/__init__.py +6 -4
  4. intentkit/abstracts/agent.py +4 -5
  5. intentkit/abstracts/engine.py +5 -5
  6. intentkit/abstracts/graph.py +15 -8
  7. intentkit/abstracts/skill.py +6 -144
  8. intentkit/abstracts/twitter.py +4 -5
  9. intentkit/clients/__init__.py +9 -2
  10. intentkit/clients/cdp.py +129 -153
  11. intentkit/{utils → clients}/s3.py +109 -34
  12. intentkit/clients/twitter.py +83 -62
  13. intentkit/clients/web3.py +4 -7
  14. intentkit/config/config.py +123 -90
  15. intentkit/core/account_checking.py +802 -0
  16. intentkit/core/agent.py +313 -498
  17. intentkit/core/asset.py +267 -0
  18. intentkit/core/chat.py +5 -3
  19. intentkit/core/client.py +1 -1
  20. intentkit/core/credit.py +49 -41
  21. intentkit/core/draft.py +201 -0
  22. intentkit/core/draft_chat.py +118 -0
  23. intentkit/core/engine.py +378 -287
  24. intentkit/core/manager/__init__.py +25 -0
  25. intentkit/core/manager/engine.py +220 -0
  26. intentkit/core/manager/service.py +172 -0
  27. intentkit/core/manager/skills.py +178 -0
  28. intentkit/core/middleware.py +231 -0
  29. intentkit/core/prompt.py +74 -114
  30. intentkit/core/scheduler.py +143 -0
  31. intentkit/core/statistics.py +168 -0
  32. intentkit/models/agent.py +931 -518
  33. intentkit/models/agent_data.py +165 -106
  34. intentkit/models/agent_schema.json +38 -251
  35. intentkit/models/app_setting.py +15 -13
  36. intentkit/models/chat.py +86 -140
  37. intentkit/models/credit.py +182 -162
  38. intentkit/models/db.py +42 -23
  39. intentkit/models/db_mig.py +120 -3
  40. intentkit/models/draft.py +222 -0
  41. intentkit/models/llm.csv +31 -0
  42. intentkit/models/llm.py +262 -370
  43. intentkit/models/redis.py +6 -4
  44. intentkit/models/skill.py +222 -101
  45. intentkit/models/skills.csv +173 -0
  46. intentkit/models/team.py +189 -0
  47. intentkit/models/user.py +103 -31
  48. intentkit/skills/acolyt/__init__.py +2 -9
  49. intentkit/skills/acolyt/ask.py +3 -4
  50. intentkit/skills/acolyt/base.py +4 -9
  51. intentkit/skills/acolyt/schema.json +4 -3
  52. intentkit/skills/aixbt/__init__.py +2 -13
  53. intentkit/skills/aixbt/base.py +1 -7
  54. intentkit/skills/aixbt/projects.py +14 -15
  55. intentkit/skills/aixbt/schema.json +4 -4
  56. intentkit/skills/allora/__init__.py +2 -9
  57. intentkit/skills/allora/base.py +4 -9
  58. intentkit/skills/allora/price.py +3 -4
  59. intentkit/skills/allora/schema.json +3 -2
  60. intentkit/skills/base.py +241 -41
  61. intentkit/skills/basename/__init__.py +51 -0
  62. intentkit/skills/basename/base.py +11 -0
  63. intentkit/skills/basename/basename.svg +11 -0
  64. intentkit/skills/basename/schema.json +58 -0
  65. intentkit/skills/carv/__init__.py +115 -121
  66. intentkit/skills/carv/base.py +184 -185
  67. intentkit/skills/carv/fetch_news.py +3 -3
  68. intentkit/skills/carv/onchain_query.py +4 -4
  69. intentkit/skills/carv/schema.json +134 -137
  70. intentkit/skills/carv/token_info_and_price.py +6 -6
  71. intentkit/skills/casino/__init__.py +4 -15
  72. intentkit/skills/casino/base.py +1 -7
  73. intentkit/skills/casino/deck_draw.py +5 -8
  74. intentkit/skills/casino/deck_shuffle.py +6 -6
  75. intentkit/skills/casino/dice_roll.py +2 -4
  76. intentkit/skills/casino/schema.json +0 -1
  77. intentkit/skills/cdp/__init__.py +22 -84
  78. intentkit/skills/cdp/base.py +1 -7
  79. intentkit/skills/cdp/schema.json +11 -314
  80. intentkit/skills/chainlist/__init__.py +2 -7
  81. intentkit/skills/chainlist/base.py +1 -7
  82. intentkit/skills/chainlist/chain_lookup.py +18 -18
  83. intentkit/skills/chainlist/schema.json +3 -5
  84. intentkit/skills/common/__init__.py +2 -9
  85. intentkit/skills/common/base.py +1 -7
  86. intentkit/skills/common/current_time.py +1 -2
  87. intentkit/skills/common/schema.json +2 -2
  88. intentkit/skills/cookiefun/__init__.py +6 -9
  89. intentkit/skills/cookiefun/base.py +2 -7
  90. intentkit/skills/cookiefun/get_account_details.py +7 -7
  91. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  92. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  93. intentkit/skills/cookiefun/get_sectors.py +3 -3
  94. intentkit/skills/cookiefun/schema.json +1 -3
  95. intentkit/skills/cookiefun/search_accounts.py +9 -9
  96. intentkit/skills/cryptocompare/__init__.py +7 -24
  97. intentkit/skills/cryptocompare/api.py +2 -3
  98. intentkit/skills/cryptocompare/base.py +10 -24
  99. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  100. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  101. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  102. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  103. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  104. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  105. intentkit/skills/cryptocompare/schema.json +3 -3
  106. intentkit/skills/cryptopanic/__init__.py +7 -10
  107. intentkit/skills/cryptopanic/base.py +51 -55
  108. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  109. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  110. intentkit/skills/cryptopanic/schema.json +105 -103
  111. intentkit/skills/dapplooker/__init__.py +2 -9
  112. intentkit/skills/dapplooker/base.py +4 -9
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  114. intentkit/skills/dapplooker/schema.json +3 -5
  115. intentkit/skills/defillama/__init__.py +24 -74
  116. intentkit/skills/defillama/api.py +6 -9
  117. intentkit/skills/defillama/base.py +8 -19
  118. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  119. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  120. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  121. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  122. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  123. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  124. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  125. intentkit/skills/defillama/config/chains.py +1 -3
  126. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  127. intentkit/skills/defillama/schema.json +5 -1
  128. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  129. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  130. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  131. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  132. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  133. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  134. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  135. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  136. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  137. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  138. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  139. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  140. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  141. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  142. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  143. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  144. intentkit/skills/dexscreener/__init__.py +97 -102
  145. intentkit/skills/dexscreener/base.py +125 -130
  146. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  147. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  148. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  149. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  150. intentkit/skills/dexscreener/schema.json +91 -93
  151. intentkit/skills/dexscreener/search_token.py +182 -184
  152. intentkit/skills/dexscreener/utils.py +15 -14
  153. intentkit/skills/dune_analytics/__init__.py +7 -9
  154. intentkit/skills/dune_analytics/base.py +48 -52
  155. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  156. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  157. intentkit/skills/dune_analytics/schema.json +104 -99
  158. intentkit/skills/elfa/__init__.py +5 -18
  159. intentkit/skills/elfa/base.py +10 -14
  160. intentkit/skills/elfa/mention.py +19 -21
  161. intentkit/skills/elfa/schema.json +3 -2
  162. intentkit/skills/elfa/stats.py +4 -4
  163. intentkit/skills/elfa/tokens.py +12 -12
  164. intentkit/skills/elfa/utils.py +26 -28
  165. intentkit/skills/enso/__init__.py +11 -31
  166. intentkit/skills/enso/base.py +54 -35
  167. intentkit/skills/enso/best_yield.py +16 -24
  168. intentkit/skills/enso/networks.py +6 -11
  169. intentkit/skills/enso/prices.py +11 -13
  170. intentkit/skills/enso/route.py +34 -38
  171. intentkit/skills/enso/schema.json +3 -2
  172. intentkit/skills/enso/tokens.py +29 -38
  173. intentkit/skills/enso/wallet.py +76 -191
  174. intentkit/skills/erc20/__init__.py +50 -0
  175. intentkit/skills/erc20/base.py +11 -0
  176. intentkit/skills/erc20/erc20.svg +5 -0
  177. intentkit/skills/erc20/schema.json +74 -0
  178. intentkit/skills/erc721/__init__.py +53 -0
  179. intentkit/skills/erc721/base.py +11 -0
  180. intentkit/skills/erc721/erc721.svg +5 -0
  181. intentkit/skills/erc721/schema.json +90 -0
  182. intentkit/skills/firecrawl/__init__.py +5 -18
  183. intentkit/skills/firecrawl/base.py +4 -9
  184. intentkit/skills/firecrawl/clear.py +4 -8
  185. intentkit/skills/firecrawl/crawl.py +19 -19
  186. intentkit/skills/firecrawl/query.py +4 -3
  187. intentkit/skills/firecrawl/schema.json +2 -6
  188. intentkit/skills/firecrawl/scrape.py +17 -22
  189. intentkit/skills/firecrawl/utils.py +50 -42
  190. intentkit/skills/github/__init__.py +2 -7
  191. intentkit/skills/github/base.py +1 -7
  192. intentkit/skills/github/github_search.py +1 -2
  193. intentkit/skills/github/schema.json +3 -4
  194. intentkit/skills/heurist/__init__.py +8 -27
  195. intentkit/skills/heurist/base.py +4 -9
  196. intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
  197. intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
  198. intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
  199. intentkit/skills/heurist/image_generation_braindance.py +13 -15
  200. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
  201. intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
  202. intentkit/skills/heurist/image_generation_sdxl.py +13 -15
  203. intentkit/skills/heurist/schema.json +2 -2
  204. intentkit/skills/http/__init__.py +4 -15
  205. intentkit/skills/http/base.py +1 -7
  206. intentkit/skills/http/get.py +21 -16
  207. intentkit/skills/http/post.py +23 -18
  208. intentkit/skills/http/put.py +23 -18
  209. intentkit/skills/http/schema.json +4 -5
  210. intentkit/skills/lifi/__init__.py +8 -13
  211. intentkit/skills/lifi/base.py +3 -9
  212. intentkit/skills/lifi/schema.json +17 -8
  213. intentkit/skills/lifi/token_execute.py +150 -60
  214. intentkit/skills/lifi/token_quote.py +8 -10
  215. intentkit/skills/lifi/utils.py +104 -51
  216. intentkit/skills/moralis/__init__.py +6 -10
  217. intentkit/skills/moralis/api.py +6 -7
  218. intentkit/skills/moralis/base.py +5 -10
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  223. intentkit/skills/moralis/schema.json +7 -2
  224. intentkit/skills/morpho/__init__.py +52 -0
  225. intentkit/skills/morpho/base.py +11 -0
  226. intentkit/skills/morpho/morpho.svg +12 -0
  227. intentkit/skills/morpho/schema.json +73 -0
  228. intentkit/skills/nation/__init__.py +4 -9
  229. intentkit/skills/nation/base.py +5 -10
  230. intentkit/skills/nation/nft_check.py +3 -4
  231. intentkit/skills/nation/schema.json +4 -3
  232. intentkit/skills/onchain.py +30 -0
  233. intentkit/skills/openai/__init__.py +17 -18
  234. intentkit/skills/openai/base.py +10 -14
  235. intentkit/skills/openai/dalle_image_generation.py +4 -9
  236. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  237. intentkit/skills/openai/gpt_image_generation.py +5 -9
  238. intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
  239. intentkit/skills/openai/gpt_image_to_image.py +5 -9
  240. intentkit/skills/openai/image_to_text.py +3 -7
  241. intentkit/skills/openai/schema.json +34 -3
  242. intentkit/skills/portfolio/__init__.py +11 -35
  243. intentkit/skills/portfolio/base.py +33 -19
  244. intentkit/skills/portfolio/schema.json +3 -5
  245. intentkit/skills/portfolio/token_balances.py +21 -21
  246. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  247. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  248. intentkit/skills/portfolio/wallet_history.py +31 -31
  249. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  250. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  251. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  252. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  253. intentkit/skills/portfolio/wallet_stats.py +3 -3
  254. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  255. intentkit/skills/pyth/__init__.py +50 -0
  256. intentkit/skills/pyth/base.py +11 -0
  257. intentkit/skills/pyth/pyth.svg +6 -0
  258. intentkit/skills/pyth/schema.json +75 -0
  259. intentkit/skills/skills.toml +36 -0
  260. intentkit/skills/slack/__init__.py +5 -17
  261. intentkit/skills/slack/base.py +3 -9
  262. intentkit/skills/slack/get_channel.py +8 -8
  263. intentkit/skills/slack/get_message.py +9 -9
  264. intentkit/skills/slack/schedule_message.py +5 -5
  265. intentkit/skills/slack/schema.json +2 -2
  266. intentkit/skills/slack/send_message.py +3 -5
  267. intentkit/skills/supabase/__init__.py +7 -23
  268. intentkit/skills/supabase/base.py +1 -7
  269. intentkit/skills/supabase/delete_data.py +4 -4
  270. intentkit/skills/supabase/fetch_data.py +12 -12
  271. intentkit/skills/supabase/insert_data.py +4 -4
  272. intentkit/skills/supabase/invoke_function.py +6 -6
  273. intentkit/skills/supabase/schema.json +2 -3
  274. intentkit/skills/supabase/update_data.py +6 -6
  275. intentkit/skills/supabase/upsert_data.py +4 -4
  276. intentkit/skills/superfluid/__init__.py +53 -0
  277. intentkit/skills/superfluid/base.py +11 -0
  278. intentkit/skills/superfluid/schema.json +89 -0
  279. intentkit/skills/superfluid/superfluid.svg +6 -0
  280. intentkit/skills/system/__init__.py +7 -24
  281. intentkit/skills/system/add_autonomous_task.py +10 -12
  282. intentkit/skills/system/delete_autonomous_task.py +2 -2
  283. intentkit/skills/system/edit_autonomous_task.py +14 -18
  284. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  285. intentkit/skills/system/read_agent_api_key.py +6 -4
  286. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  287. intentkit/skills/system/schema.json +6 -8
  288. intentkit/skills/tavily/__init__.py +3 -12
  289. intentkit/skills/tavily/base.py +4 -9
  290. intentkit/skills/tavily/schema.json +3 -5
  291. intentkit/skills/tavily/tavily_extract.py +2 -4
  292. intentkit/skills/tavily/tavily_search.py +4 -6
  293. intentkit/skills/token/__init__.py +5 -10
  294. intentkit/skills/token/base.py +7 -11
  295. intentkit/skills/token/erc20_transfers.py +19 -19
  296. intentkit/skills/token/schema.json +3 -6
  297. intentkit/skills/token/token_analytics.py +3 -3
  298. intentkit/skills/token/token_price.py +13 -13
  299. intentkit/skills/token/token_search.py +9 -9
  300. intentkit/skills/twitter/__init__.py +11 -35
  301. intentkit/skills/twitter/base.py +22 -34
  302. intentkit/skills/twitter/follow_user.py +2 -6
  303. intentkit/skills/twitter/get_mentions.py +5 -12
  304. intentkit/skills/twitter/get_timeline.py +4 -12
  305. intentkit/skills/twitter/get_user_by_username.py +2 -6
  306. intentkit/skills/twitter/get_user_tweets.py +5 -13
  307. intentkit/skills/twitter/like_tweet.py +2 -6
  308. intentkit/skills/twitter/post_tweet.py +6 -9
  309. intentkit/skills/twitter/reply_tweet.py +6 -9
  310. intentkit/skills/twitter/retweet.py +2 -6
  311. intentkit/skills/twitter/schema.json +1 -0
  312. intentkit/skills/twitter/search_tweets.py +4 -12
  313. intentkit/skills/unrealspeech/__init__.py +2 -7
  314. intentkit/skills/unrealspeech/base.py +2 -8
  315. intentkit/skills/unrealspeech/schema.json +2 -5
  316. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  317. intentkit/skills/venice_audio/__init__.py +98 -106
  318. intentkit/skills/venice_audio/base.py +117 -121
  319. intentkit/skills/venice_audio/input.py +41 -41
  320. intentkit/skills/venice_audio/schema.json +151 -152
  321. intentkit/skills/venice_audio/venice_audio.py +38 -21
  322. intentkit/skills/venice_image/__init__.py +147 -154
  323. intentkit/skills/venice_image/api.py +138 -138
  324. intentkit/skills/venice_image/base.py +185 -192
  325. intentkit/skills/venice_image/config.py +33 -35
  326. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  327. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  328. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  329. intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
  330. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  332. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  333. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  334. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  335. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  336. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  337. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  338. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  339. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  340. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  341. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  344. intentkit/skills/venice_image/schema.json +267 -267
  345. intentkit/skills/venice_image/utils.py +77 -78
  346. intentkit/skills/web_scraper/__init__.py +5 -18
  347. intentkit/skills/web_scraper/base.py +21 -7
  348. intentkit/skills/web_scraper/document_indexer.py +7 -6
  349. intentkit/skills/web_scraper/schema.json +2 -6
  350. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  351. intentkit/skills/web_scraper/utils.py +62 -63
  352. intentkit/skills/web_scraper/website_indexer.py +17 -19
  353. intentkit/skills/weth/__init__.py +49 -0
  354. intentkit/skills/weth/base.py +11 -0
  355. intentkit/skills/weth/schema.json +58 -0
  356. intentkit/skills/weth/weth.svg +6 -0
  357. intentkit/skills/wow/__init__.py +51 -0
  358. intentkit/skills/wow/base.py +11 -0
  359. intentkit/skills/wow/schema.json +89 -0
  360. intentkit/skills/wow/wow.svg +7 -0
  361. intentkit/skills/x402/__init__.py +58 -0
  362. intentkit/skills/x402/base.py +99 -0
  363. intentkit/skills/x402/http_request.py +117 -0
  364. intentkit/skills/x402/schema.json +40 -0
  365. intentkit/skills/x402/x402.webp +0 -0
  366. intentkit/skills/xmtp/__init__.py +4 -15
  367. intentkit/skills/xmtp/base.py +5 -5
  368. intentkit/skills/xmtp/price.py +7 -6
  369. intentkit/skills/xmtp/schema.json +69 -71
  370. intentkit/skills/xmtp/swap.py +6 -8
  371. intentkit/skills/xmtp/transfer.py +4 -6
  372. intentkit/utils/__init__.py +4 -0
  373. intentkit/utils/chain.py +198 -96
  374. intentkit/utils/ens.py +135 -0
  375. intentkit/utils/error.py +5 -2
  376. intentkit/utils/logging.py +9 -11
  377. intentkit/utils/schema.py +100 -0
  378. intentkit/utils/slack_alert.py +8 -8
  379. intentkit/utils/tx.py +16 -8
  380. intentkit/uv.lock +3377 -0
  381. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
  382. intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
  383. intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
  384. intentkit/core/node.py +0 -215
  385. intentkit/models/conversation.py +0 -286
  386. intentkit/models/generator.py +0 -347
  387. intentkit/skills/cdp/get_balance.py +0 -110
  388. intentkit/skills/cdp/swap.py +0 -121
  389. intentkit/skills/moralis/tests/__init__.py +0 -0
  390. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  391. intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
  392. {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
  393. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
@@ -1,347 +0,0 @@
1
- """Agent Generation Log Model.
2
-
3
- This module defines the database models for logging agent generation operations,
4
- including token usage, prompts, AI responses, and generation metadata.
5
- """
6
-
7
- from datetime import datetime, timezone
8
- from typing import Annotated, Optional
9
-
10
- from epyxid import XID
11
- from intentkit.models.base import Base
12
- from pydantic import BaseModel, ConfigDict, Field
13
- from sqlalchemy import (
14
- Boolean,
15
- Column,
16
- DateTime,
17
- Integer,
18
- String,
19
- Text,
20
- func,
21
- select,
22
- )
23
- from sqlalchemy.dialects.postgresql import JSON, JSONB
24
- from sqlalchemy.ext.asyncio import AsyncSession
25
-
26
-
27
- class AgentGenerationLogTable(Base):
28
- """Agent generation log database table model."""
29
-
30
- __tablename__ = "agent_generation_logs"
31
-
32
- id = Column(
33
- String,
34
- primary_key=True,
35
- )
36
- user_id = Column(
37
- String,
38
- nullable=True,
39
- )
40
- prompt = Column(
41
- Text,
42
- nullable=False,
43
- )
44
- existing_agent_id = Column(
45
- String,
46
- nullable=True,
47
- )
48
- is_update = Column(
49
- Boolean,
50
- default=False,
51
- nullable=False,
52
- )
53
- generated_agent_schema = Column(
54
- JSON().with_variant(JSONB(), "postgresql"),
55
- nullable=True,
56
- )
57
- identified_skills = Column(
58
- JSON().with_variant(JSONB(), "postgresql"),
59
- nullable=True,
60
- )
61
- # LLM API response data
62
- llm_model = Column(
63
- String,
64
- nullable=True,
65
- )
66
- total_tokens = Column(
67
- Integer,
68
- default=0,
69
- )
70
- input_tokens = Column(
71
- Integer,
72
- default=0,
73
- )
74
- cached_input_tokens = Column(
75
- Integer,
76
- default=0,
77
- )
78
- output_tokens = Column(
79
- Integer,
80
- default=0,
81
- )
82
- input_tokens_details = Column(
83
- JSON().with_variant(JSONB(), "postgresql"),
84
- nullable=True,
85
- )
86
- completion_tokens_details = Column(
87
- JSON().with_variant(JSONB(), "postgresql"),
88
- nullable=True,
89
- )
90
- # Performance metrics
91
- generation_time_ms = Column(
92
- Integer,
93
- nullable=True,
94
- )
95
- retry_count = Column(
96
- Integer,
97
- default=0,
98
- )
99
- validation_errors = Column(
100
- JSON().with_variant(JSONB(), "postgresql"),
101
- nullable=True,
102
- )
103
- # Status and results
104
- success = Column(
105
- Boolean,
106
- default=False,
107
- nullable=False,
108
- )
109
- error_message = Column(
110
- Text,
111
- nullable=True,
112
- )
113
- # Timestamps
114
- created_at = Column(
115
- DateTime(timezone=True),
116
- nullable=False,
117
- server_default=func.now(),
118
- )
119
- completed_at = Column(
120
- DateTime(timezone=True),
121
- nullable=True,
122
- )
123
-
124
-
125
- class AgentGenerationLogCreate(BaseModel):
126
- """Model for creating agent generation log entries."""
127
-
128
- model_config = ConfigDict(
129
- use_enum_values=True,
130
- from_attributes=True,
131
- )
132
-
133
- id: Annotated[
134
- str,
135
- Field(
136
- default_factory=lambda: str(XID()),
137
- description="Unique identifier for the generation log",
138
- ),
139
- ]
140
- user_id: Optional[str] = Field(
141
- None,
142
- description="User ID who initiated the generation",
143
- )
144
- prompt: str = Field(
145
- ...,
146
- description="The original prompt used for generation",
147
- )
148
- existing_agent_id: Optional[str] = Field(
149
- None,
150
- description="ID of existing agent if this is an update operation",
151
- )
152
- is_update: bool = Field(
153
- False,
154
- description="Whether this is an update to existing agent",
155
- )
156
-
157
-
158
- class AgentGenerationLog(BaseModel):
159
- """Agent generation log model."""
160
-
161
- model_config = ConfigDict(
162
- use_enum_values=True,
163
- from_attributes=True,
164
- )
165
-
166
- id: str
167
- user_id: Optional[str] = None
168
- prompt: str
169
- existing_agent_id: Optional[str] = None
170
- is_update: bool = False
171
- generated_agent_schema: Optional[dict] = None
172
- identified_skills: Optional[dict] = None
173
- llm_model: Optional[str] = None
174
- total_tokens: int = 0
175
- input_tokens: int = 0
176
- cached_input_tokens: int = 0
177
- output_tokens: int = 0
178
- input_tokens_details: Optional[dict] = None
179
- completion_tokens_details: Optional[dict] = None
180
- generation_time_ms: Optional[int] = None
181
- retry_count: int = 0
182
- validation_errors: Optional[dict] = None
183
- success: bool = False
184
- error_message: Optional[str] = None
185
- created_at: datetime
186
- completed_at: Optional[datetime] = None
187
-
188
- @classmethod
189
- async def create(
190
- cls,
191
- session: AsyncSession,
192
- log_data: AgentGenerationLogCreate,
193
- ) -> "AgentGenerationLog":
194
- """Create a new agent generation log entry.
195
-
196
- Args:
197
- session: Database session
198
- log_data: Log data to create
199
-
200
- Returns:
201
- Created log instance
202
- """
203
- # Create database record
204
- log_record = AgentGenerationLogTable(
205
- id=log_data.id,
206
- user_id=log_data.user_id,
207
- prompt=log_data.prompt,
208
- existing_agent_id=log_data.existing_agent_id,
209
- is_update=log_data.is_update,
210
- )
211
-
212
- session.add(log_record)
213
- await session.commit()
214
- await session.refresh(log_record)
215
-
216
- return cls.model_validate(log_record)
217
-
218
- async def update_completion(
219
- self,
220
- session: AsyncSession,
221
- generated_agent_schema: Optional[dict] = None,
222
- identified_skills: Optional[dict] = None,
223
- llm_model: Optional[str] = None,
224
- total_tokens: int = 0,
225
- input_tokens: int = 0,
226
- cached_input_tokens: int = 0,
227
- output_tokens: int = 0,
228
- input_tokens_details: Optional[dict] = None,
229
- completion_tokens_details: Optional[dict] = None,
230
- generation_time_ms: Optional[int] = None,
231
- retry_count: int = 0,
232
- validation_errors: Optional[dict] = None,
233
- success: bool = False,
234
- error_message: Optional[str] = None,
235
- ) -> None:
236
- """Update the log entry with completion data.
237
-
238
- Args:
239
- session: Database session
240
- generated_agent_schema: The generated agent schema
241
- identified_skills: Skills identified during generation
242
- llm_model: LLM model used
243
- total_tokens: Total tokens used
244
- input_tokens: Input tokens used
245
- cached_input_tokens: Cached input tokens used (for cost calculation)
246
- output_tokens: Output tokens used
247
- input_tokens_details: Detailed input token breakdown
248
- completion_tokens_details: Detailed completion token breakdown
249
- generation_time_ms: Generation time in milliseconds
250
- retry_count: Number of retries attempted
251
- validation_errors: Any validation errors encountered
252
- success: Whether generation was successful
253
- error_message: Error message if generation failed
254
- """
255
- # Get the database record
256
- log_record = await session.get(AgentGenerationLogTable, self.id)
257
- if not log_record:
258
- return
259
-
260
- # Update fields
261
- log_record.generated_agent_schema = generated_agent_schema
262
- log_record.identified_skills = identified_skills
263
- log_record.llm_model = llm_model
264
- log_record.total_tokens = total_tokens
265
- log_record.input_tokens = input_tokens
266
- log_record.cached_input_tokens = cached_input_tokens
267
- log_record.output_tokens = output_tokens
268
- log_record.input_tokens_details = input_tokens_details
269
- log_record.completion_tokens_details = completion_tokens_details
270
- log_record.generation_time_ms = generation_time_ms
271
- log_record.retry_count = retry_count
272
- log_record.validation_errors = validation_errors
273
- log_record.success = success
274
- log_record.error_message = error_message
275
- log_record.completed_at = datetime.now(timezone.utc)
276
-
277
- session.add(log_record)
278
- await session.commit()
279
- await session.refresh(log_record)
280
-
281
- # Update this instance
282
- self.generated_agent_schema = log_record.generated_agent_schema
283
- self.identified_skills = log_record.identified_skills
284
- self.llm_model = log_record.llm_model
285
- self.total_tokens = log_record.total_tokens
286
- self.input_tokens = log_record.input_tokens
287
- self.cached_input_tokens = log_record.cached_input_tokens
288
- self.output_tokens = log_record.output_tokens
289
- self.input_tokens_details = log_record.input_tokens_details
290
- self.completion_tokens_details = log_record.completion_tokens_details
291
- self.generation_time_ms = log_record.generation_time_ms
292
- self.retry_count = log_record.retry_count
293
- self.validation_errors = log_record.validation_errors
294
- self.success = log_record.success
295
- self.error_message = log_record.error_message
296
- self.completed_at = log_record.completed_at
297
-
298
- @classmethod
299
- async def get_by_id(
300
- cls,
301
- session: AsyncSession,
302
- log_id: str,
303
- ) -> Optional["AgentGenerationLog"]:
304
- """Get an agent generation log by ID.
305
-
306
- Args:
307
- session: Database session
308
- log_id: Log ID
309
-
310
- Returns:
311
- Log instance if found, None otherwise
312
- """
313
- result = await session.execute(
314
- select(AgentGenerationLogTable).where(AgentGenerationLogTable.id == log_id)
315
- )
316
- log_record = result.scalar_one_or_none()
317
-
318
- if log_record:
319
- return cls.model_validate(log_record)
320
- return None
321
-
322
- @classmethod
323
- async def get_by_user(
324
- cls,
325
- session: AsyncSession,
326
- user_id: str,
327
- limit: int = 50,
328
- ) -> list["AgentGenerationLog"]:
329
- """Get agent generation logs for a user.
330
-
331
- Args:
332
- session: Database session
333
- user_id: User ID
334
- limit: Maximum number of logs to return
335
-
336
- Returns:
337
- List of log instances
338
- """
339
- result = await session.execute(
340
- select(AgentGenerationLogTable)
341
- .where(AgentGenerationLogTable.user_id == user_id)
342
- .order_by(AgentGenerationLogTable.created_at.desc())
343
- .limit(limit)
344
- )
345
- log_records = result.scalars().all()
346
-
347
- return [cls.model_validate(record) for record in log_records]
@@ -1,110 +0,0 @@
1
- from typing import Optional, Type
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- from intentkit.abstracts.skill import SkillStoreABC
6
- from intentkit.clients import get_cdp_client
7
- from intentkit.skills.cdp.base import CDPBaseTool
8
-
9
-
10
- class GetBalanceInput(BaseModel):
11
- """Input for GetBalance tool."""
12
-
13
- asset_id: Optional[str] = Field(
14
- default=None,
15
- description="The asset ID to get the balance for (e.g., 'eth', 'usdc', or a valid contract address). If not provided, returns all token balances.",
16
- )
17
-
18
-
19
- class GetBalance(CDPBaseTool):
20
- """Tool for getting balance from CDP wallet.
21
-
22
- This tool uses the CDP API to get balance for all addresses in a wallet for a given asset.
23
-
24
- Attributes:
25
- name: The name of the tool.
26
- description: A description of what the tool does.
27
- args_schema: The schema for the tool's input arguments.
28
- """
29
-
30
- agent_id: str
31
- skill_store: SkillStoreABC
32
-
33
- name: str = "cdp_get_balance"
34
- description: str = (
35
- "This tool will get the balance of all the addresses in the wallet. If asset_id is provided, it returns the balance for that specific asset. "
36
- "If no asset_id is provided, it returns all token balances. "
37
- "Always use 'eth' for the native asset ETH and 'usdc' for USDC. "
38
- "Other valid asset IDs are: weth,dai,reth,brett,w,cbeth,axl,iotx,prime,aero,rsr,mog,tbtc,npc,yfi"
39
- )
40
- args_schema: Type[BaseModel] = GetBalanceInput
41
-
42
- async def _arun(self, asset_id: Optional[str] = None) -> str:
43
- """Async implementation of the tool to get balance.
44
-
45
- Args:
46
- asset_id (Optional[str]): The asset ID to get the balance for. If None, returns all token balances.
47
-
48
- Returns:
49
- str: A message containing the balance information or error message.
50
- """
51
- # Get network information from CDP client
52
- cdp_client = await get_cdp_client(self.agent_id, self.skill_store)
53
- provider = await cdp_client.get_wallet_provider()
54
- provider_config = await cdp_client.get_provider_config()
55
- network_id = provider_config.network_id
56
-
57
- # Map network_id to the format expected by the API
58
- network_mapping = {
59
- "base-mainnet": "base",
60
- "ethereum-mainnet": "ethereum",
61
- }
62
- api_network = network_mapping.get(network_id, network_id)
63
-
64
- # For native ETH balance, use the account's balance directly
65
- if asset_id and asset_id.lower() == "eth":
66
- try:
67
- # Get native balance using Web3
68
- balance_wei = provider.get_balance()
69
- balance_eth = balance_wei / (10**18) # Convert from wei to ETH
70
- return f"ETH balance: {balance_eth} ETH"
71
- except Exception as e:
72
- return f"Error getting ETH balance: {e!s}"
73
-
74
- client = provider.get_client()
75
- async with client:
76
- account = await client.evm.get_account(provider.get_address())
77
- # If no asset_id provided, return all token balances
78
- if asset_id is None:
79
- # Get native ETH balance
80
- balance_wei = provider.get_balance()
81
- balance_eth = balance_wei / (10**18) # Convert from wei to ETH
82
-
83
- # Get all token balances
84
- token_balances = await account.list_token_balances(api_network)
85
-
86
- result = [f"ETH balance: {balance_eth} ETH"]
87
-
88
- for balance in token_balances.balances:
89
- result.append(
90
- f"{balance.token.symbol} balance: {balance.amount.decimals} {balance.token.name}"
91
- )
92
-
93
- return f"All balances for account {account.address}:\n" + "\n".join(
94
- result
95
- )
96
-
97
- # For other tokens, try the list_token_balances API
98
- token_balances = await account.list_token_balances(api_network)
99
-
100
- # Find the balance for the specific asset
101
- target_balance = None
102
- for balance in token_balances.balances:
103
- if balance.token.symbol.lower() == asset_id.lower():
104
- target_balance = balance
105
- break
106
-
107
- if target_balance:
108
- return f"Balance for {asset_id} in account {account.address}: {target_balance.amount.decimals} {target_balance.token.name}"
109
- else:
110
- return f"No balance found for asset {asset_id} in account {account.address}"
@@ -1,121 +0,0 @@
1
- from typing import Optional, Type, Union
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- from intentkit.abstracts.skill import SkillStoreABC
6
- from intentkit.clients import get_cdp_client
7
- from intentkit.skills.cdp.base import CDPBaseTool
8
-
9
-
10
- class SwapInput(BaseModel):
11
- """Input for Swap tool."""
12
-
13
- from_token: str = Field(
14
- description="The contract address of the token to swap from (e.g., '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' for USDC on Base)"
15
- )
16
- to_token: str = Field(
17
- description="The contract address of the token to swap to (e.g., '0x4200000000000000000000000000000000000006' for WETH on Base)"
18
- )
19
- from_amount: Union[str, int] = Field(
20
- description="The amount to swap from in smallest unit (e.g., 1000000 for 1 USDC with 6 decimals)"
21
- )
22
- slippage_bps: Optional[int] = Field(
23
- default=100,
24
- description="Maximum slippage in basis points (100 = 1%). Defaults to 100 (1%)",
25
- )
26
-
27
-
28
- class Swap(CDPBaseTool):
29
- """Tool for swapping tokens using CDP wallet.
30
-
31
- This tool uses the CDP API to execute token swaps on supported networks.
32
- It wraps the swap functionality from the EVM account.
33
-
34
- Attributes:
35
- name: The name of the tool.
36
- description: A description of what the tool does.
37
- args_schema: The schema for the tool's input arguments.
38
- """
39
-
40
- agent_id: str
41
- skill_store: SkillStoreABC
42
-
43
- name: str = "cdp_swap"
44
- description: str = (
45
- "This tool will swap tokens using the CDP wallet. "
46
- "It supports swapping between any ERC-20 tokens on supported networks (Base and Ethereum). "
47
- "You need to provide the contract addresses of both tokens and the amount to swap. "
48
- "The amount should be in the smallest unit of the token (e.g., wei for ETH, or atomic units for ERC-20 tokens). "
49
- "Common token addresses on Base: USDC=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, WETH=0x4200000000000000000000000000000000000006. "
50
- "The tool will automatically handle gas estimation and transaction submission."
51
- )
52
- args_schema: Type[BaseModel] = SwapInput
53
-
54
- async def _arun(
55
- self,
56
- from_token: str,
57
- to_token: str,
58
- from_amount: Union[str, int],
59
- slippage_bps: Optional[int] = 100,
60
- ) -> str:
61
- """Async implementation of the tool to swap tokens.
62
-
63
- Args:
64
- from_token (str): The contract address of the token to swap from.
65
- to_token (str): The contract address of the token to swap to.
66
- from_amount (Union[str, int]): The amount to swap from in smallest unit.
67
- slippage_bps (Optional[int]): Maximum slippage in basis points. Defaults to 100 (1%).
68
-
69
- Returns:
70
- str: A message containing the swap result or error message.
71
- """
72
- try:
73
- # Get CDP client and network information
74
- cdp_client = await get_cdp_client(self.agent_id, self.skill_store)
75
- provider = await cdp_client.get_wallet_provider()
76
- provider_config = await cdp_client.get_provider_config()
77
- network_id = provider_config.network_id
78
-
79
- # Map network_id to the format expected by the swap API
80
- network_mapping = {
81
- "base-mainnet": "base",
82
- "ethereum-mainnet": "ethereum",
83
- }
84
- api_network = network_mapping.get(network_id, network_id)
85
-
86
- # Validate network is supported
87
- supported_networks = ["base", "ethereum"]
88
- if api_network not in supported_networks:
89
- return f"Error: Network {api_network} is not supported for swaps. Supported networks: {', '.join(supported_networks)}"
90
-
91
- # Get the EVM account
92
- client = provider.get_client()
93
- async with client:
94
- account = await client.evm.get_account(provider.get_address())
95
-
96
- # Import AccountSwapOptions here to avoid circular imports
97
- from cdp.actions.evm.swap.types import AccountSwapOptions
98
-
99
- # Create swap options
100
- swap_options = AccountSwapOptions(
101
- network=api_network,
102
- from_token=from_token,
103
- to_token=to_token,
104
- from_amount=str(from_amount),
105
- slippage_bps=slippage_bps,
106
- )
107
-
108
- # Execute the swap
109
- result = await account.swap(swap_options)
110
-
111
- return (
112
- f"Swap executed successfully!\n"
113
- f"Transaction hash: {result.transaction_hash}\n"
114
- f"Swapped from {from_token} to {to_token}\n"
115
- f"Amount: {from_amount} (smallest units)\n"
116
- f"Network: {api_network}\n"
117
- f"Slippage tolerance: {slippage_bps} basis points ({slippage_bps / 100 if slippage_bps else 0}%)"
118
- )
119
-
120
- except Exception as e:
121
- return f"Error executing swap: {e!s}"
File without changes