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,86 @@
1
+ """Casino skills for card games and dice rolling."""
2
+
3
+ import logging
4
+ from typing import TypedDict
5
+
6
+ from intentkit.skills.base import SkillConfig, SkillState
7
+ from intentkit.skills.casino.base import CasinoBaseTool
8
+ from intentkit.skills.casino.deck_draw import CasinoDeckDraw
9
+ from intentkit.skills.casino.deck_shuffle import CasinoDeckShuffle
10
+ from intentkit.skills.casino.dice_roll import CasinoDiceRoll
11
+
12
+ # Cache skills at the system level, because they are stateless
13
+ _cache: dict[str, CasinoBaseTool] = {}
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class SkillStates(TypedDict):
19
+ deck_shuffle: SkillState
20
+ deck_draw: SkillState
21
+ dice_roll: SkillState
22
+
23
+
24
+ class Config(SkillConfig):
25
+ """Configuration for Casino skills."""
26
+
27
+ states: SkillStates
28
+
29
+
30
+ async def get_skills(
31
+ config: "Config",
32
+ is_private: bool,
33
+ **_,
34
+ ) -> list[CasinoBaseTool]:
35
+ """Get all Casino skills.
36
+
37
+ Args:
38
+ config: The configuration for Casino skills.
39
+ is_private: Whether to include private skills.
40
+
41
+ Returns:
42
+ A list of Casino skills.
43
+ """
44
+ available_skills = []
45
+
46
+ # Include skills based on their state
47
+ for skill_name, state in config["states"].items():
48
+ if state == "disabled":
49
+ continue
50
+ elif state == "public" or (state == "private" and is_private):
51
+ available_skills.append(skill_name)
52
+
53
+ # Get each skill using the cached getter
54
+ result = []
55
+ for name in available_skills:
56
+ skill = get_casino_skill(name)
57
+ if skill:
58
+ result.append(skill)
59
+ return result
60
+
61
+
62
+ def get_casino_skill(
63
+ name: str,
64
+ ) -> CasinoBaseTool:
65
+ """Get a Casino skill by name.
66
+
67
+ Args:
68
+ name: The name of the skill to get
69
+
70
+ Returns:
71
+ The requested Casino skill
72
+ """
73
+ if name == "deck_shuffle":
74
+ if name not in _cache:
75
+ _cache[name] = CasinoDeckShuffle()
76
+ return _cache[name]
77
+ elif name == "deck_draw":
78
+ if name not in _cache:
79
+ _cache[name] = CasinoDeckDraw()
80
+ return _cache[name]
81
+ elif name == "dice_roll":
82
+ if name not in _cache:
83
+ _cache[name] = CasinoDiceRoll()
84
+ return _cache[name]
85
+ else:
86
+ raise ValueError(f"Unknown Casino skill: {name}")
@@ -0,0 +1,17 @@
1
+ """Base class for Casino tools."""
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from intentkit.skills.base import IntentKitSkill
6
+
7
+
8
+ class CasinoBaseTool(IntentKitSkill):
9
+ """Base class for Casino tools."""
10
+
11
+ name: str = Field(description="The name of the tool")
12
+ description: str = Field(description="A description of what the tool does")
13
+ args_schema: type[BaseModel]
14
+
15
+ @property
16
+ def category(self) -> str:
17
+ return "casino"
Binary file
@@ -0,0 +1,127 @@
1
+ """Card drawing skill using Deck of Cards API."""
2
+
3
+ import logging
4
+
5
+ try:
6
+ import httpx
7
+ except ImportError:
8
+ raise ImportError(
9
+ "httpx is required for Casino skills. Install it with: pip install httpx"
10
+ )
11
+ from pydantic import BaseModel, Field
12
+
13
+ from intentkit.skills.casino.base import CasinoBaseTool
14
+ from intentkit.skills.casino.utils import (
15
+ CURRENT_DECK_KEY,
16
+ DECK_STORAGE_KEY,
17
+ ENDPOINTS,
18
+ RATE_LIMITS,
19
+ format_card_info,
20
+ validate_card_count,
21
+ )
22
+
23
+ NAME = "casino_deck_draw"
24
+ PROMPT = (
25
+ "Draw cards from the current deck. If no deck exists, a new one will be created. "
26
+ "Returns detailed card information including images."
27
+ )
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ class CasinoDeckDrawInput(BaseModel):
33
+ """Input for CasinoDeckDraw tool."""
34
+
35
+ count: int = Field(default=1, description="Number of cards to draw (1-10)")
36
+
37
+
38
+ class CasinoDeckDraw(CasinoBaseTool):
39
+ """Tool for drawing cards from a deck.
40
+
41
+ This tool uses the Deck of Cards API to draw cards from the current deck.
42
+
43
+ Attributes:
44
+ name: The name of the tool.
45
+ description: A description of what the tool does.
46
+ args_schema: The schema for the tool's input arguments.
47
+ """
48
+
49
+ name: str = NAME
50
+ description: str = PROMPT
51
+ args_schema: type[BaseModel] = CasinoDeckDrawInput
52
+
53
+ async def _arun(self, count: int = 1, **kwargs) -> dict:
54
+ try:
55
+ context = self.get_context()
56
+
57
+ # Apply rate limit using built-in user_rate_limit method
58
+ rate_config = RATE_LIMITS["deck_draw"]
59
+ await self.user_rate_limit(
60
+ rate_config["max_requests"],
61
+ rate_config["interval"],
62
+ "deck_draw",
63
+ )
64
+
65
+ # Validate count
66
+ count = validate_card_count(count)
67
+
68
+ # Get current deck info
69
+ deck_info = await self.get_agent_skill_data_raw(
70
+ DECK_STORAGE_KEY, CURRENT_DECK_KEY
71
+ )
72
+
73
+ deck_id = "new" # Default to new deck
74
+ if deck_info and deck_info.get("deck_id"):
75
+ deck_id = deck_info["deck_id"]
76
+
77
+ # Build API URL
78
+ url = ENDPOINTS["deck_draw"].format(deck_id=deck_id)
79
+ params = {"count": count}
80
+
81
+ async with httpx.AsyncClient() as client:
82
+ response = await client.get(url, params=params)
83
+
84
+ if response.status_code == 200:
85
+ data = response.json()
86
+
87
+ if data.get("success"):
88
+ # Update deck info
89
+ if deck_id == "new":
90
+ deck_info = {
91
+ "deck_id": data["deck_id"],
92
+ "deck_count": 1,
93
+ "jokers_enabled": False,
94
+ "remaining": data["remaining"],
95
+ "shuffled": True,
96
+ }
97
+ else:
98
+ deck_info["remaining"] = data["remaining"]
99
+
100
+ await self.save_agent_skill_data_raw(
101
+ DECK_STORAGE_KEY,
102
+ CURRENT_DECK_KEY,
103
+ deck_info,
104
+ )
105
+
106
+ # Format card information with images
107
+ cards = [
108
+ format_card_info(card) for card in data.get("cards", [])
109
+ ]
110
+
111
+ return {
112
+ "success": True,
113
+ "cards_drawn": cards,
114
+ "remaining_cards": data["remaining"],
115
+ "deck_id": data["deck_id"],
116
+ "message": f"Drew {len(cards)} card{'s' if len(cards) > 1 else ''} "
117
+ f"({data['remaining']} remaining)",
118
+ }
119
+ else:
120
+ return {"success": False, "error": "Failed to draw cards"}
121
+ else:
122
+ logger.error(f"Deck API error: {response.status_code}")
123
+ return {"success": False, "error": "Failed to draw cards"}
124
+
125
+ except Exception as e:
126
+ logger.error(f"Error drawing cards: {str(e)}")
127
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -0,0 +1,118 @@
1
+ """Deck shuffling skill using Deck of Cards API."""
2
+
3
+ import logging
4
+
5
+ try:
6
+ import httpx
7
+ except ImportError:
8
+ raise ImportError(
9
+ "httpx is required for Casino skills. Install it with: pip install httpx"
10
+ )
11
+ from pydantic import BaseModel, Field
12
+
13
+ from intentkit.skills.casino.base import CasinoBaseTool
14
+ from intentkit.skills.casino.utils import (
15
+ CURRENT_DECK_KEY,
16
+ DECK_STORAGE_KEY,
17
+ ENDPOINTS,
18
+ RATE_LIMITS,
19
+ validate_deck_count,
20
+ )
21
+
22
+ NAME = "casino_deck_shuffle"
23
+ PROMPT = (
24
+ "Create and shuffle a new deck of cards. You can specify the number of decks "
25
+ "to use (default is 1) and optionally include jokers."
26
+ )
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ class CasinoDeckShuffleInput(BaseModel):
32
+ """Input for CasinoDeckShuffle tool."""
33
+
34
+ deck_count: int = Field(
35
+ default=1, description="Number of decks to use (1-6, default 1)"
36
+ )
37
+ jokers_enabled: bool = Field(
38
+ default=False, description="Whether to include jokers in the deck"
39
+ )
40
+
41
+
42
+ class CasinoDeckShuffle(CasinoBaseTool):
43
+ """Tool for creating and shuffling card decks.
44
+
45
+ This tool uses the Deck of Cards API to create new shuffled decks.
46
+
47
+ Attributes:
48
+ name: The name of the tool.
49
+ description: A description of what the tool does.
50
+ args_schema: The schema for the tool's input arguments.
51
+ """
52
+
53
+ name: str = NAME
54
+ description: str = PROMPT
55
+ args_schema: type[BaseModel] = CasinoDeckShuffleInput
56
+
57
+ async def _arun(
58
+ self, deck_count: int = 1, jokers_enabled: bool = False, **kwargs
59
+ ) -> dict:
60
+ try:
61
+ context = self.get_context()
62
+
63
+ # Apply rate limit using built-in user_rate_limit method
64
+ rate_config = RATE_LIMITS["deck_shuffle"]
65
+ await self.user_rate_limit(
66
+ rate_config["max_requests"],
67
+ rate_config["interval"],
68
+ "deck_shuffle",
69
+ )
70
+
71
+ # Validate deck count
72
+ deck_count = validate_deck_count(deck_count)
73
+
74
+ # Build API URL and parameters
75
+ url = ENDPOINTS["deck_new_shuffle"]
76
+ params = {"deck_count": deck_count}
77
+
78
+ if jokers_enabled:
79
+ params["jokers_enabled"] = "true"
80
+
81
+ async with httpx.AsyncClient() as client:
82
+ response = await client.get(url, params=params)
83
+
84
+ if response.status_code == 200:
85
+ data = response.json()
86
+
87
+ # Store deck info for the agent
88
+ deck_info = {
89
+ "deck_id": data["deck_id"],
90
+ "deck_count": deck_count,
91
+ "jokers_enabled": jokers_enabled,
92
+ "remaining": data["remaining"],
93
+ "shuffled": data["shuffled"],
94
+ }
95
+
96
+ await self.save_agent_skill_data_raw(
97
+ DECK_STORAGE_KEY,
98
+ CURRENT_DECK_KEY,
99
+ deck_info,
100
+ )
101
+
102
+ return {
103
+ "success": True,
104
+ "deck_id": data["deck_id"],
105
+ "deck_count": deck_count,
106
+ "jokers_enabled": jokers_enabled,
107
+ "remaining_cards": data["remaining"],
108
+ "message": f"Created and shuffled {'a new deck' if deck_count == 1 else f'{deck_count} decks'} "
109
+ f"with {data['remaining']} cards"
110
+ + (" (including jokers)" if jokers_enabled else ""),
111
+ }
112
+ else:
113
+ logger.error(f"Deck API error: {response.status_code}")
114
+ return {"success": False, "error": "Failed to create deck"}
115
+
116
+ except Exception as e:
117
+ logger.error(f"Error shuffling deck: {str(e)}")
118
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -0,0 +1,100 @@
1
+ """Quantum dice rolling skill using QRandom API."""
2
+
3
+ import logging
4
+
5
+ try:
6
+ import httpx
7
+ except ImportError:
8
+ raise ImportError(
9
+ "httpx is required for Casino skills. Install it with: pip install httpx"
10
+ )
11
+ from pydantic import BaseModel, Field
12
+
13
+ from intentkit.skills.casino.base import CasinoBaseTool
14
+ from intentkit.skills.casino.utils import (
15
+ ENDPOINTS,
16
+ RATE_LIMITS,
17
+ get_dice_visual,
18
+ validate_dice_count,
19
+ )
20
+
21
+ NAME = "casino_dice_roll"
22
+ PROMPT = (
23
+ "Roll quantum random dice using true quantum randomness. "
24
+ "Can roll multiple 6-sided dice at once for games."
25
+ )
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ class CasinoDiceRollInput(BaseModel):
31
+ """Input for CasinoDiceRoll tool."""
32
+
33
+ dice_count: int = Field(default=1, description="Number of dice to roll (1-10)")
34
+
35
+
36
+ class CasinoDiceRoll(CasinoBaseTool):
37
+ """Tool for rolling quantum random dice.
38
+
39
+ This tool uses the QRandom API to generate truly random dice rolls
40
+ using quantum randomness.
41
+
42
+ Attributes:
43
+ name: The name of the tool.
44
+ description: A description of what the tool does.
45
+ args_schema: The schema for the tool's input arguments.
46
+ """
47
+
48
+ name: str = NAME
49
+ description: str = PROMPT
50
+ args_schema: type[BaseModel] = CasinoDiceRollInput
51
+
52
+ async def _arun(self, dice_count: int = 1, **kwargs) -> dict:
53
+ try:
54
+ context = self.get_context()
55
+
56
+ # Apply rate limit using built-in user_rate_limit method
57
+ rate_config = RATE_LIMITS["dice_roll"]
58
+ await self.user_rate_limit(
59
+ rate_config["max_requests"],
60
+ rate_config["interval"],
61
+ "dice_roll",
62
+ )
63
+
64
+ # Validate dice count
65
+ dice_count = validate_dice_count(dice_count)
66
+
67
+ # Build API URL
68
+ url = ENDPOINTS["dice_roll"]
69
+ params = {"n": dice_count}
70
+
71
+ async with httpx.AsyncClient() as client:
72
+ response = await client.get(url, params=params)
73
+
74
+ if response.status_code == 200:
75
+ data = response.json()
76
+
77
+ dice_results = data.get("dice", [])
78
+ total = sum(dice_results)
79
+
80
+ # Generate dice emoji representation
81
+ dice_visual = get_dice_visual(dice_results)
82
+
83
+ return {
84
+ "success": True,
85
+ "dice_results": dice_results,
86
+ "dice_visual": dice_visual,
87
+ "total": total,
88
+ "dice_count": len(dice_results),
89
+ "quantum_signature": data.get("signature", ""),
90
+ "quantum_id": data.get("id", ""),
91
+ "message": f"Rolled {len(dice_results)} dice: {' '.join(dice_visual)} "
92
+ f"(Total: {total})",
93
+ }
94
+ else:
95
+ logger.error(f"QRandom API error: {response.status_code}")
96
+ return {"success": False, "error": "Failed to roll dice"}
97
+
98
+ except Exception as e:
99
+ logger.error(f"Error rolling dice: {str(e)}")
100
+ raise type(e)(f"[agent:{context.agent_id}]: {e}") from e
@@ -0,0 +1,77 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "Casino",
5
+ "description": "Casino gaming skills including card decks and quantum dice rolling for interactive games with users",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/casino/casino.png",
7
+ "x-tags": [
8
+ "Entertainment"
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
+ "deck_shuffle": {
21
+ "type": "string",
22
+ "title": "Shuffle Card Deck",
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": "Create and shuffle new card decks with customizable options",
34
+ "default": "disabled"
35
+ },
36
+ "deck_draw": {
37
+ "type": "string",
38
+ "title": "Draw Cards",
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": "Draw cards from the current deck with detailed card information and images",
50
+ "default": "disabled"
51
+ },
52
+ "dice_roll": {
53
+ "type": "string",
54
+ "title": "Roll Quantum Dice",
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": "Roll dice using quantum random number generation for true randomness",
66
+ "default": "disabled"
67
+ }
68
+ },
69
+ "description": "States for each Casino skill"
70
+ }
71
+ },
72
+ "required": [
73
+ "states",
74
+ "enabled"
75
+ ],
76
+ "additionalProperties": true
77
+ }
@@ -0,0 +1,107 @@
1
+ """
2
+ Casino Skills Utilities
3
+
4
+ Common constants, URLs, and helper functions for Casino skills.
5
+ """
6
+
7
+ # API URLs
8
+ DECK_OF_CARDS_API_BASE = "https://www.deckofcardsapi.com/api/deck"
9
+ QRANDOM_API_BASE = "https://qrandom.io/api/random"
10
+
11
+ # API Endpoints
12
+ ENDPOINTS = {
13
+ "deck_new_shuffle": f"{DECK_OF_CARDS_API_BASE}/new/shuffle/",
14
+ "deck_draw": f"{DECK_OF_CARDS_API_BASE}/{{deck_id}}/draw/",
15
+ "dice_roll": f"{QRANDOM_API_BASE}/dice",
16
+ }
17
+
18
+ # Rate Limits (requests per minute)
19
+ RATE_LIMITS = {
20
+ "deck_shuffle": {"max_requests": 20, "interval": 60},
21
+ "deck_draw": {"max_requests": 30, "interval": 60},
22
+ "dice_roll": {"max_requests": 15, "interval": 60},
23
+ }
24
+
25
+ # Storage Keys
26
+ DECK_STORAGE_KEY = "casino_deck"
27
+ CURRENT_DECK_KEY = "current_deck"
28
+
29
+ # Dice visual representation
30
+ DICE_EMOJI = ["⚀", "⚁", "⚂", "⚃", "⚄", "⚅"]
31
+
32
+ # Card back image URL for display
33
+ CARD_BACK_IMAGE = "https://www.deckofcardsapi.com/static/img/back.png"
34
+
35
+ # Validation limits
36
+ MAX_DECK_COUNT = 6
37
+ MIN_DECK_COUNT = 1
38
+ MAX_CARDS_DRAW = 10
39
+ MIN_CARDS_DRAW = 1
40
+ MAX_DICE_COUNT = 10
41
+ MIN_DICE_COUNT = 1
42
+
43
+
44
+ def get_dice_visual(dice_results: list[int]) -> list[str]:
45
+ """Convert dice numbers to emoji representation.
46
+
47
+ Args:
48
+ dice_results: List of dice roll results (1-6)
49
+
50
+ Returns:
51
+ List of dice emoji strings
52
+ """
53
+ return [DICE_EMOJI[result - 1] for result in dice_results if 1 <= result <= 6]
54
+
55
+
56
+ def validate_deck_count(count: int) -> int:
57
+ """Validate and normalize deck count.
58
+
59
+ Args:
60
+ count: Requested deck count
61
+
62
+ Returns:
63
+ Normalized deck count within valid range
64
+ """
65
+ return max(MIN_DECK_COUNT, min(MAX_DECK_COUNT, count))
66
+
67
+
68
+ def validate_card_count(count: int) -> int:
69
+ """Validate and normalize card draw count.
70
+
71
+ Args:
72
+ count: Requested card count
73
+
74
+ Returns:
75
+ Normalized card count within valid range
76
+ """
77
+ return max(MIN_CARDS_DRAW, min(MAX_CARDS_DRAW, count))
78
+
79
+
80
+ def validate_dice_count(count: int) -> int:
81
+ """Validate and normalize dice count.
82
+
83
+ Args:
84
+ count: Requested dice count
85
+
86
+ Returns:
87
+ Normalized dice count within valid range
88
+ """
89
+ return max(MIN_DICE_COUNT, min(MAX_DICE_COUNT, count))
90
+
91
+
92
+ def format_card_info(card: dict) -> dict:
93
+ """Format card information for consistent output.
94
+
95
+ Args:
96
+ card: Raw card data from Deck of Cards API
97
+
98
+ Returns:
99
+ Formatted card information
100
+ """
101
+ return {
102
+ "value": card["value"],
103
+ "suit": card["suit"],
104
+ "code": card["code"],
105
+ "image": card["image"],
106
+ "svg_image": card["images"]["svg"],
107
+ }