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
@@ -0,0 +1,89 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "WOW",
5
+ "description": "WOW social token actions via Coinbase AgentKit",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/wow/wow.svg",
7
+ "x-tags": [
8
+ "Crypto"
9
+ ],
10
+ "properties": {
11
+ "enabled": {
12
+ "type": "boolean",
13
+ "title": "Enabled",
14
+ "description": "Whether this skill is enabled",
15
+ "default": false
16
+ },
17
+ "states": {
18
+ "type": "object",
19
+ "properties": {
20
+ "WowActionProvider_buy_token": {
21
+ "type": "string",
22
+ "title": "Buy Token",
23
+ "enum": [
24
+ "disabled",
25
+ "public",
26
+ "private"
27
+ ],
28
+ "x-enum-title": [
29
+ "Disabled",
30
+ "Agent Owner + All Users",
31
+ "Agent Owner Only"
32
+ ],
33
+ "description": "State for WowActionProvider_buy_token",
34
+ "default": "disabled"
35
+ },
36
+ "WowActionProvider_create_token": {
37
+ "type": "string",
38
+ "title": "Create Token",
39
+ "enum": [
40
+ "disabled",
41
+ "public",
42
+ "private"
43
+ ],
44
+ "x-enum-title": [
45
+ "Disabled",
46
+ "Agent Owner + All Users",
47
+ "Agent Owner Only"
48
+ ],
49
+ "description": "State for WowActionProvider_create_token",
50
+ "default": "disabled"
51
+ },
52
+ "WowActionProvider_sell_token": {
53
+ "type": "string",
54
+ "title": "Sell Token",
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": "State for WowActionProvider_sell_token",
66
+ "default": "disabled"
67
+ }
68
+ },
69
+ "description": "States for each WOW skill (disabled, public, or private)"
70
+ },
71
+ "api_key_provider": {
72
+ "type": "string",
73
+ "title": "API Key Provider",
74
+ "description": "Who provides the API key",
75
+ "enum": [
76
+ "platform"
77
+ ],
78
+ "x-enum-title": [
79
+ "Nation Hosted"
80
+ ],
81
+ "default": "platform"
82
+ }
83
+ },
84
+ "required": [
85
+ "states",
86
+ "enabled"
87
+ ],
88
+ "additionalProperties": true
89
+ }
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
2
+ <rect width="128" height="128" fill="#0f766e" rx="16" />
3
+ <text x="50%" y="50%" font-family="Arial,Helvetica,sans-serif" font-size="48" fill="#ecfeff" font-weight="700" text-anchor="middle">WOW</text>
4
+ <circle cx="32" cy="96" r="12" fill="#5eead4" />
5
+ <circle cx="64" cy="96" r="12" fill="#34d399" />
6
+ <circle cx="96" cy="96" r="12" fill="#22c55e" />
7
+ </svg>
@@ -0,0 +1,58 @@
1
+ """x402 skill category."""
2
+
3
+ import logging
4
+ from typing import TypedDict
5
+
6
+ from intentkit.skills.base import SkillConfig, SkillState
7
+ from intentkit.skills.x402.base import X402BaseSkill
8
+ from intentkit.skills.x402.http_request import X402HttpRequest
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ _cache: dict[str, X402BaseSkill] = {}
13
+
14
+
15
+ class SkillStates(TypedDict):
16
+ x402_http_request: SkillState
17
+
18
+
19
+ class Config(SkillConfig):
20
+ """Configuration for x402 skills."""
21
+
22
+ states: SkillStates
23
+
24
+
25
+ _SKILL_BUILDERS: dict[str, type[X402BaseSkill]] = {
26
+ "x402_http_request": X402HttpRequest,
27
+ }
28
+
29
+
30
+ async def get_skills(
31
+ config: "Config",
32
+ is_private: bool,
33
+ **_,
34
+ ) -> list[X402BaseSkill]:
35
+ """Return enabled x402 skills for the agent."""
36
+ enabled_skills = []
37
+ for skill_name, state in config["states"].items():
38
+ if state == "disabled":
39
+ continue
40
+ if state == "public" or (state == "private" and is_private):
41
+ enabled_skills.append(skill_name)
42
+
43
+ result: list[X402BaseSkill] = []
44
+ for name in enabled_skills:
45
+ skill = _get_skill(name)
46
+ if skill:
47
+ result.append(skill)
48
+ return result
49
+
50
+
51
+ def _get_skill(name: str) -> X402BaseSkill | None:
52
+ builder = _SKILL_BUILDERS.get(name)
53
+ if builder:
54
+ if name not in _cache:
55
+ _cache[name] = builder()
56
+ return _cache[name]
57
+ logger.warning("Unknown x402 skill requested: %s", name)
58
+ return None
@@ -0,0 +1,99 @@
1
+ import logging
2
+ import threading
3
+ from collections.abc import AsyncIterator
4
+ from contextlib import asynccontextmanager
5
+ from typing import Any
6
+
7
+ from coinbase_agentkit.wallet_providers.evm_wallet_provider import (
8
+ EvmWalletSigner as CoinbaseEvmWalletSigner,
9
+ )
10
+ from x402.clients.httpx import x402HttpxClient
11
+
12
+ from intentkit.clients import get_wallet_provider
13
+ from intentkit.skills.onchain import IntentKitOnChainSkill
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class X402BaseSkill(IntentKitOnChainSkill):
19
+ """Base class for x402 skills."""
20
+
21
+ @property
22
+ def category(self) -> str:
23
+ return "x402"
24
+
25
+ async def _get_signer(self) -> "ThreadSafeEvmWalletSigner":
26
+ context = self.get_context()
27
+ wallet_provider = await get_wallet_provider(context.agent)
28
+ return ThreadSafeEvmWalletSigner(wallet_provider)
29
+
30
+ @asynccontextmanager
31
+ async def http_client(
32
+ self,
33
+ timeout: float = 30.0,
34
+ ) -> AsyncIterator[x402HttpxClient]:
35
+ account = await self._get_signer()
36
+ try:
37
+ async with x402HttpxClient(
38
+ account=account,
39
+ timeout=timeout,
40
+ ) as client:
41
+ yield client
42
+ except Exception:
43
+ logger.exception("Failed to create x402 HTTP client")
44
+ raise
45
+
46
+
47
+ class ThreadSafeEvmWalletSigner(CoinbaseEvmWalletSigner):
48
+ """EVM wallet signer that avoids nested event loop errors.
49
+
50
+ Coinbase's signer runs async wallet calls in the current thread. When invoked
51
+ inside an active asyncio loop (as happens in async skills), it trips over the
52
+ loop already running. We hop work to a background thread so the provider can
53
+ spin up its own loop safely.
54
+ """
55
+
56
+ def __init__(self, wallet_provider: Any):
57
+ super().__init__(wallet_provider=wallet_provider)
58
+
59
+ def _run_in_thread(self, func: Any, *args: Any, **kwargs: Any) -> Any:
60
+ result: list[Any] = []
61
+ error: list[BaseException] = []
62
+
63
+ def _target() -> None:
64
+ try:
65
+ result.append(func(*args, **kwargs))
66
+ except BaseException as exc: # pragma: no cover - bubble up original error
67
+ error.append(exc)
68
+
69
+ thread = threading.Thread(target=_target, daemon=True)
70
+ thread.start()
71
+ thread.join()
72
+
73
+ if error:
74
+ raise error[0]
75
+ return result[0] if result else None
76
+
77
+ def unsafe_sign_hash(self, message_hash: Any) -> Any:
78
+ return self._run_in_thread(super().unsafe_sign_hash, message_hash)
79
+
80
+ def sign_message(self, signable_message: Any) -> Any:
81
+ return self._run_in_thread(super().sign_message, signable_message)
82
+
83
+ def sign_transaction(self, transaction_dict: Any) -> Any:
84
+ return self._run_in_thread(super().sign_transaction, transaction_dict)
85
+
86
+ def sign_typed_data(
87
+ self,
88
+ domain_data: Any | None = None,
89
+ message_types: Any | None = None,
90
+ message_data: Any | None = None,
91
+ full_message: Any | None = None,
92
+ ) -> Any:
93
+ return self._run_in_thread(
94
+ super().sign_typed_data,
95
+ domain_data=domain_data,
96
+ message_types=message_types,
97
+ message_data=message_data,
98
+ full_message=full_message,
99
+ )
@@ -0,0 +1,117 @@
1
+ import logging
2
+ from typing import Any
3
+ from urllib.parse import urlparse
4
+
5
+ import httpx
6
+ from langchain_core.tools import ToolException
7
+ from pydantic import BaseModel, Field
8
+
9
+ from intentkit.skills.x402.base import X402BaseSkill
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class X402HttpRequestInput(BaseModel):
15
+ """Arguments for a generic x402 HTTP request."""
16
+
17
+ method: str = Field(description="HTTP method to use. Supported values: GET, POST.")
18
+ url: str = Field(
19
+ description="Absolute URL for the request (must include scheme and host)."
20
+ )
21
+ headers: dict[str, str] | None = Field(
22
+ default=None,
23
+ description="Optional headers to include in the request.",
24
+ )
25
+ params: dict[str, Any] | None = Field(
26
+ default=None,
27
+ description="Optional query parameters to include in the request.",
28
+ )
29
+ data: dict[str, Any] | str | None = Field(
30
+ default=None,
31
+ description=(
32
+ "Optional request body. Dictionaries are sent as JSON; strings are sent as raw data. "
33
+ "Only supported for POST requests."
34
+ ),
35
+ )
36
+ timeout: float | None = Field(
37
+ default=30.0,
38
+ description="Request timeout in seconds.",
39
+ )
40
+
41
+
42
+ class X402HttpRequest(X402BaseSkill):
43
+ """Skill that performs signed HTTP requests via the x402 client."""
44
+
45
+ name: str = "x402_http_request"
46
+ description: str = (
47
+ "Send an HTTP GET or POST request using the x402 payment protocol. "
48
+ "Provide the method, absolute URL, optional headers, query parameters, and request body. "
49
+ "Returns the response status and body text."
50
+ )
51
+ args_schema: type[BaseModel] = X402HttpRequestInput
52
+
53
+ async def _arun(
54
+ self,
55
+ method: str,
56
+ url: str,
57
+ headers: dict[str, str] | None = None,
58
+ params: dict[str, Any] | None = None,
59
+ data: dict[str, Any] | str | None = None,
60
+ timeout: float = 30.0,
61
+ **_: Any,
62
+ ) -> str:
63
+ method_upper = method.upper()
64
+ if method_upper not in {"GET", "POST"}:
65
+ raise ToolException(
66
+ f"Unsupported HTTP method '{method}'. Only GET and POST are allowed."
67
+ )
68
+
69
+ parsed = urlparse(url)
70
+ if not (parsed.scheme and parsed.netloc):
71
+ raise ToolException("URL must include scheme and host (absolute URL).")
72
+
73
+ request_headers = dict(headers or {})
74
+ request_kwargs: dict[str, Any] = {
75
+ "url": url,
76
+ "headers": request_headers or None,
77
+ "params": params,
78
+ "timeout": timeout,
79
+ }
80
+
81
+ if method_upper == "POST":
82
+ if isinstance(data, dict):
83
+ header_keys = {key.lower() for key in request_headers}
84
+ if "content-type" not in header_keys:
85
+ request_headers["Content-Type"] = "application/json"
86
+ request_kwargs["json"] = data
87
+ elif isinstance(data, str):
88
+ request_kwargs["content"] = data
89
+ elif data is not None:
90
+ raise ToolException(
91
+ "POST body must be either a JSON-serializable object or a string."
92
+ )
93
+ elif data is not None:
94
+ raise ToolException("Request body is only supported for POST requests.")
95
+
96
+ try:
97
+ async with self.http_client(timeout=timeout) as client:
98
+ response = await client.request(method_upper, **request_kwargs)
99
+ response.raise_for_status()
100
+ return f"Status: {response.status_code}\nContent: {response.text}"
101
+ except ValueError as exc:
102
+ raise ToolException(str(exc)) from exc
103
+ except httpx.TimeoutException as exc:
104
+ raise ToolException(
105
+ f"Request to {url} timed out after {timeout} seconds"
106
+ ) from exc
107
+ except httpx.HTTPStatusError as exc:
108
+ raise ToolException(
109
+ f"HTTP {exc.response.status_code} - {exc.response.text}"
110
+ ) from exc
111
+ except httpx.RequestError as exc:
112
+ raise ToolException(f"Failed to connect to {url} - {str(exc)}") from exc
113
+ except ToolException:
114
+ raise
115
+ except Exception as exc:
116
+ logger.error("Unexpected error in x402_http_request", exc_info=exc)
117
+ raise ToolException(f"Unexpected error occurred - {str(exc)}") from exc
@@ -0,0 +1,40 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "x402",
5
+ "description": "Interact with other IntentKit agents through the x402 payment protocol.",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/x402/x402.webp",
7
+ "x-tags": [
8
+ "Communication",
9
+ "Infrastructure"
10
+ ],
11
+ "properties": {
12
+ "enabled": {
13
+ "type": "boolean",
14
+ "title": "Enabled",
15
+ "description": "Whether this skill category is enabled.",
16
+ "default": false
17
+ },
18
+ "states": {
19
+ "type": "object",
20
+ "properties": {
21
+ "x402_http_request": {
22
+ "type": "string",
23
+ "title": "HTTP Request",
24
+ "enum": [
25
+ "disabled",
26
+ "public",
27
+ "private"
28
+ ],
29
+ "x-enum-title": [
30
+ "Disabled",
31
+ "Agent Owner + All Users",
32
+ "Agent Owner Only"
33
+ ],
34
+ "description": "Perform a signed HTTP GET or POST request via the x402 payment protocol.",
35
+ "default": "disabled"
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
Binary file
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.base import SkillConfig, SkillState
8
7
  from intentkit.skills.xmtp.base import XmtpBaseTool
9
8
  from intentkit.skills.xmtp.price import XmtpGetSwapPrice
@@ -31,7 +30,6 @@ class Config(SkillConfig):
31
30
  async def get_skills(
32
31
  config: "Config",
33
32
  is_private: bool,
34
- store: SkillStoreABC,
35
33
  **_,
36
34
  ) -> list[XmtpBaseTool]:
37
35
  """Get all XMTP skills.
@@ -39,7 +37,6 @@ async def get_skills(
39
37
  Args:
40
38
  config: The configuration for XMTP skills.
41
39
  is_private: Whether to include private skills.
42
- store: The skill store for persisting data.
43
40
 
44
41
  Returns:
45
42
  A list of XMTP skills.
@@ -56,7 +53,7 @@ async def get_skills(
56
53
  # Get each skill using the cached getter
57
54
  result = []
58
55
  for name in available_skills:
59
- skill = get_xmtp_skill(name, store)
56
+ skill = get_xmtp_skill(name)
60
57
  if skill:
61
58
  result.append(skill)
62
59
  return result
@@ -64,34 +61,26 @@ async def get_skills(
64
61
 
65
62
  def get_xmtp_skill(
66
63
  name: str,
67
- store: SkillStoreABC,
68
64
  ) -> XmtpBaseTool:
69
65
  """Get an XMTP skill by name.
70
66
 
71
67
  Args:
72
68
  name: The name of the skill to get
73
- store: The skill store for persisting data
74
69
 
75
70
  Returns:
76
71
  The requested XMTP skill
77
72
  """
78
73
  if name == "xmtp_transfer":
79
74
  if name not in _cache:
80
- _cache[name] = XmtpTransfer(
81
- skill_store=store,
82
- )
75
+ _cache[name] = XmtpTransfer()
83
76
  return _cache[name]
84
77
  elif name == "xmtp_swap":
85
78
  if name not in _cache:
86
- _cache[name] = XmtpSwap(
87
- skill_store=store,
88
- )
79
+ _cache[name] = XmtpSwap()
89
80
  return _cache[name]
90
81
  elif name == "xmtp_get_swap_price":
91
82
  if name not in _cache:
92
- _cache[name] = XmtpGetSwapPrice(
93
- skill_store=store,
94
- )
83
+ _cache[name] = XmtpGetSwapPrice()
95
84
  return _cache[name]
96
85
  else:
97
86
  logger.warning(f"Unknown XMTP skill: {name}")
@@ -1,16 +1,16 @@
1
- from typing import Dict, Literal
1
+ from typing import Literal
2
2
 
3
- from intentkit.skills.base import IntentKitSkill
3
+ from intentkit.skills.onchain import IntentKitOnChainSkill
4
4
 
5
5
 
6
- class XmtpBaseTool(IntentKitSkill):
6
+ class XmtpBaseTool(IntentKitOnChainSkill):
7
7
  """Base class for XMTP-related skills."""
8
8
 
9
9
  # Set response format to content_and_artifact for returning tuple
10
10
  response_format: Literal["content", "content_and_artifact"] = "content_and_artifact"
11
11
 
12
12
  # ChainId mapping for XMTP wallet_sendCalls (mainnet only)
13
- CHAIN_ID_HEX_BY_NETWORK: Dict[str, str] = {
13
+ CHAIN_ID_HEX_BY_NETWORK: dict[str, str] = {
14
14
  "ethereum-mainnet": "0x1", # 1
15
15
  "base-mainnet": "0x2105", # 8453
16
16
  "arbitrum-mainnet": "0xA4B1", # 42161
@@ -18,7 +18,7 @@ class XmtpBaseTool(IntentKitSkill):
18
18
  }
19
19
 
20
20
  # CDP network mapping for swap quote API (mainnet only)
21
- NETWORK_FOR_CDP_MAPPING: Dict[str, str] = {
21
+ NETWORK_FOR_CDP_MAPPING: dict[str, str] = {
22
22
  "ethereum-mainnet": "ethereum",
23
23
  "base-mainnet": "base",
24
24
  "arbitrum-mainnet": "arbitrum",
@@ -1,8 +1,9 @@
1
- from typing import Literal, Type
1
+ from typing import Literal
2
2
 
3
+ from langchain_core.tools.base import ToolException
3
4
  from pydantic import BaseModel, Field
4
5
 
5
- from intentkit.clients.cdp import get_origin_cdp_client
6
+ from intentkit.clients.cdp import get_cdp_client
6
7
  from intentkit.skills.xmtp.base import XmtpBaseTool
7
8
 
8
9
 
@@ -23,7 +24,7 @@ class XmtpGetSwapPrice(XmtpBaseTool):
23
24
  name: str = "xmtp_get_swap_price"
24
25
  description: str = "Get an indicative swap price/quote for token pair and amount on Ethereum, Base, Arbitrum, and Optimism mainnet networks using CDP."
25
26
  response_format: Literal["content", "content_and_artifact"] = "content"
26
- args_schema: Type[BaseModel] = SwapPriceInput
27
+ args_schema: type[BaseModel] = SwapPriceInput
27
28
 
28
29
  async def _arun(
29
30
  self,
@@ -43,14 +44,14 @@ class XmtpGetSwapPrice(XmtpBaseTool):
43
44
  "optimism-mainnet",
44
45
  ]
45
46
  if agent.network_id not in supported_networks:
46
- raise ValueError(
47
+ raise ToolException(
47
48
  f"Swap price only supported on {', '.join(supported_networks)}. Current: {agent.network_id}"
48
49
  )
49
50
 
50
51
  network_for_cdp = self.get_cdp_network(agent.network_id)
51
52
 
52
- cdp_client = get_origin_cdp_client(self.skill_store)
53
- # Note: Don't use async with context manager as get_origin_cdp_client returns a managed global client
53
+ cdp_client = get_cdp_client()
54
+ # Note: Don't use async with context manager as get_cdp_client returns a managed global client
54
55
  price = await cdp_client.evm.get_swap_price(
55
56
  from_token=from_token,
56
57
  to_token=to_token,