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
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import NotRequired, TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.base import SkillConfig, SkillState
8
7
  from intentkit.skills.heurist.base import HeuristBaseTool
9
8
  from intentkit.skills.heurist.image_generation_animagine_xl import (
@@ -52,7 +51,6 @@ class Config(SkillConfig):
52
51
  async def get_skills(
53
52
  config: "Config",
54
53
  is_private: bool,
55
- store: SkillStoreABC,
56
54
  **_,
57
55
  ) -> list[HeuristBaseTool]:
58
56
  """Get all Heurist AI skills.
@@ -60,7 +58,6 @@ async def get_skills(
60
58
  Args:
61
59
  config: The configuration for Heurist AI skills.
62
60
  is_private: Whether to include private skills.
63
- store: The skill store for persisting data.
64
61
 
65
62
  Returns:
66
63
  A list of Heurist AI skills.
@@ -77,7 +74,7 @@ async def get_skills(
77
74
  # Get each skill using the cached getter
78
75
  result = []
79
76
  for name in available_skills:
80
- skill = get_heurist_skill(name, store)
77
+ skill = get_heurist_skill(name)
81
78
  if skill:
82
79
  result.append(skill)
83
80
  return result
@@ -85,58 +82,42 @@ async def get_skills(
85
82
 
86
83
  def get_heurist_skill(
87
84
  name: str,
88
- store: SkillStoreABC,
89
85
  ) -> HeuristBaseTool:
90
86
  """Get a Heurist AI skill by name.
91
87
 
92
88
  Args:
93
89
  name: The name of the skill to get
94
- store: The skill store for persisting data
95
90
 
96
91
  Returns:
97
92
  The requested Heurist AI skill
98
93
  """
99
94
  if name == "image_generation_animagine_xl":
100
95
  if name not in _cache:
101
- _cache[name] = ImageGenerationAnimagineXL(
102
- skill_store=store,
103
- )
96
+ _cache[name] = ImageGenerationAnimagineXL()
104
97
  return _cache[name]
105
98
  elif name == "image_generation_arthemy_comics":
106
99
  if name not in _cache:
107
- _cache[name] = ImageGenerationArthemyComics(
108
- skill_store=store,
109
- )
100
+ _cache[name] = ImageGenerationArthemyComics()
110
101
  return _cache[name]
111
102
  elif name == "image_generation_arthemy_real":
112
103
  if name not in _cache:
113
- _cache[name] = ImageGenerationArthemyReal(
114
- skill_store=store,
115
- )
104
+ _cache[name] = ImageGenerationArthemyReal()
116
105
  return _cache[name]
117
106
  elif name == "image_generation_braindance":
118
107
  if name not in _cache:
119
- _cache[name] = ImageGenerationBrainDance(
120
- skill_store=store,
121
- )
108
+ _cache[name] = ImageGenerationBrainDance()
122
109
  return _cache[name]
123
110
  elif name == "image_generation_cyber_realistic_xl":
124
111
  if name not in _cache:
125
- _cache[name] = ImageGenerationCyberRealisticXL(
126
- skill_store=store,
127
- )
112
+ _cache[name] = ImageGenerationCyberRealisticXL()
128
113
  return _cache[name]
129
114
  elif name == "image_generation_flux_1_dev":
130
115
  if name not in _cache:
131
- _cache[name] = ImageGenerationFlux1Dev(
132
- skill_store=store,
133
- )
116
+ _cache[name] = ImageGenerationFlux1Dev()
134
117
  return _cache[name]
135
118
  elif name == "image_generation_sdxl":
136
119
  if name not in _cache:
137
- _cache[name] = ImageGenerationSDXL(
138
- skill_store=store,
139
- )
120
+ _cache[name] = ImageGenerationSDXL()
140
121
  return _cache[name]
141
122
  else:
142
123
  logger.warning(f"Unknown Heurist skill: {name}")
@@ -1,11 +1,9 @@
1
1
  """Base class for Heurist AI skills."""
2
2
 
3
- from typing import Type
4
-
5
- from langchain.tools.base import ToolException
3
+ from langchain_core.tools.base import ToolException
6
4
  from pydantic import BaseModel, Field
7
5
 
8
- from intentkit.abstracts.skill import SkillStoreABC
6
+ from intentkit.config.config import config
9
7
  from intentkit.skills.base import IntentKitSkill
10
8
 
11
9
 
@@ -17,17 +15,14 @@ class HeuristBaseTool(IntentKitSkill):
17
15
 
18
16
  name: str = Field(description="The name of the tool")
19
17
  description: str = Field(description="A description of what the tool does")
20
- args_schema: Type[BaseModel]
21
- skill_store: SkillStoreABC = Field(
22
- description="The skill store for persisting data"
23
- )
18
+ args_schema: type[BaseModel]
24
19
 
25
20
  def get_api_key(self) -> str:
26
21
  context = self.get_context()
27
22
  skill_config = context.agent.skill_config(self.category)
28
23
  api_key_provider = skill_config.get("api_key_provider")
29
24
  if api_key_provider == "platform":
30
- return self.skill_store.get_system_config("heurist_api_key")
25
+ return config.heurist_api_key
31
26
  # for backward compatibility, may only have api_key in skill_config
32
27
  elif skill_config.get("api_key"):
33
28
  return skill_config.get("api_key")
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationAnimagineXLInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=680,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationAnimagineXL(HeuristBaseTool):
52
52
  "AnimagineXL specializes in creating high-quality Japanese anime-style illustrations.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationAnimagineXLInput
55
+ args_schema: type[BaseModel] = ImageGenerationAnimagineXLInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate Japanese anime-style images using Heurist AI's AnimagineXL model.
@@ -79,20 +79,19 @@ class ImageGenerationAnimagineXL(HeuristBaseTool):
79
79
  skill_config = context.agent.skill_config(self.category)
80
80
  skill_config = skill_config
81
81
 
82
- # Get the Heurist API key from the skill store
82
+ # Get the Heurist API key from configuration
83
83
  if "api_key" in skill_config and skill_config["api_key"]:
84
84
  api_key = skill_config["api_key"]
85
85
  if skill_config.get("rate_limit_number") and skill_config.get(
86
86
  "rate_limit_minutes"
87
87
  ):
88
88
  await self.user_rate_limit_by_category(
89
- context.user_id,
90
89
  skill_config["rate_limit_number"],
91
- skill_config["rate_limit_minutes"],
90
+ skill_config["rate_limit_minutes"] * 60,
92
91
  )
93
92
  else:
94
- api_key = self.skill_store.get_system_config("heurist_api_key")
95
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
93
+ api_key = config.heurist_api_key
94
+ await self.user_rate_limit_by_category(10, 1440 * 60)
96
95
 
97
96
  # Generate a unique job ID
98
97
  job_id = str(XID())
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationArthemyComicsInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationArthemyComics(HeuristBaseTool):
52
52
  "ArthemyComics specializes in creating vibrant, stylized comic book illustrations.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationArthemyComicsInput
55
+ args_schema: type[BaseModel] = ImageGenerationArthemyComicsInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate comic-style images using Heurist AI's ArthemyComics model.
@@ -78,20 +78,19 @@ class ImageGenerationArthemyComics(HeuristBaseTool):
78
78
  skill_config = context.agent.skill_config(self.category)
79
79
  skill_config = skill_config
80
80
 
81
- # Get the Heurist API key from the skill store
81
+ # Get the Heurist API key from configuration
82
82
  if "api_key" in skill_config and skill_config["api_key"]:
83
83
  api_key = skill_config["api_key"]
84
84
  if skill_config.get("rate_limit_number") and skill_config.get(
85
85
  "rate_limit_minutes"
86
86
  ):
87
87
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
88
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
89
+ skill_config["rate_limit_minutes"] * 60,
91
90
  )
92
91
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
92
+ api_key = config.heurist_api_key
93
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
94
 
96
95
  # Generate a unique job ID
97
96
  job_id = str(XID())
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationArthemyRealInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationArthemyReal(HeuristBaseTool):
52
52
  "ArthemyReal specializes in creating photorealistic, lifelike images with fine details.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationArthemyRealInput
55
+ args_schema: type[BaseModel] = ImageGenerationArthemyRealInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate realistic images using Heurist AI's ArthemyReal model.
@@ -78,20 +78,19 @@ class ImageGenerationArthemyReal(HeuristBaseTool):
78
78
  skill_config = context.agent.skill_config(self.category)
79
79
  skill_config = skill_config
80
80
 
81
- # Get the Heurist API key from the skill store
81
+ # Get the Heurist API key from configuration
82
82
  if "api_key" in skill_config and skill_config["api_key"]:
83
83
  api_key = skill_config["api_key"]
84
84
  if skill_config.get("rate_limit_number") and skill_config.get(
85
85
  "rate_limit_minutes"
86
86
  ):
87
87
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
88
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
89
+ skill_config["rate_limit_minutes"] * 60,
91
90
  )
92
91
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
92
+ api_key = config.heurist_api_key
93
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
94
 
96
95
  # Generate a unique job ID
97
96
  job_id = str(XID())
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationBrainDanceInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationBrainDance(HeuristBaseTool):
52
52
  "BrainDance specializes in creating unique, artistic interpretations with creative flair.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationBrainDanceInput
55
+ args_schema: type[BaseModel] = ImageGenerationBrainDanceInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate artistic images using Heurist AI's BrainDance model.
@@ -78,20 +78,19 @@ class ImageGenerationBrainDance(HeuristBaseTool):
78
78
  skill_config = context.agent.skill_config(self.category)
79
79
  skill_config = skill_config
80
80
 
81
- # Get the Heurist API key from the skill store
81
+ # Get the Heurist API key from configuration
82
82
  if "api_key" in skill_config and skill_config["api_key"]:
83
83
  api_key = skill_config["api_key"]
84
84
  if skill_config.get("rate_limit_number") and skill_config.get(
85
85
  "rate_limit_minutes"
86
86
  ):
87
87
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
88
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
89
+ skill_config["rate_limit_minutes"] * 60,
91
90
  )
92
91
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
92
+ api_key = config.heurist_api_key
93
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
94
 
96
95
  # Generate a unique job ID
97
96
  job_id = str(XID())
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationCyberRealisticXLInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=680,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationCyberRealisticXL(HeuristBaseTool):
52
52
  "CyberRealisticXL specializes in creating high-quality hyperrealistic photographs with a cyberpunk aesthetic.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationCyberRealisticXLInput
55
+ args_schema: type[BaseModel] = ImageGenerationCyberRealisticXLInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate hyperrealistic cyberpunk images using Heurist AI's CyberRealisticXL model.
@@ -78,20 +78,19 @@ class ImageGenerationCyberRealisticXL(HeuristBaseTool):
78
78
  skill_config = context.agent.skill_config(self.category)
79
79
  skill_config = skill_config
80
80
 
81
- # Get the Heurist API key from the skill store
81
+ # Get the Heurist API key from configuration
82
82
  if "api_key" in skill_config and skill_config["api_key"]:
83
83
  api_key = skill_config["api_key"]
84
84
  if skill_config.get("rate_limit_number") and skill_config.get(
85
85
  "rate_limit_minutes"
86
86
  ):
87
87
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
88
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
89
+ skill_config["rate_limit_minutes"] * 60,
91
90
  )
92
91
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
92
+ api_key = config.heurist_api_key
93
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
94
 
96
95
  # Generate a unique job ID
97
96
  job_id = str(XID())
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationFlux1DevInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=2048,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=2048,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationFlux1Dev(HeuristBaseTool):
52
52
  "Flux.1-dev is a versatile, general-purpose model capable of generating images in any style.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationFlux1DevInput
55
+ args_schema: type[BaseModel] = ImageGenerationFlux1DevInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate images using Heurist AI's Flux.1-dev model.
@@ -78,20 +78,19 @@ class ImageGenerationFlux1Dev(HeuristBaseTool):
78
78
  skill_config = context.agent.skill_config(self.category)
79
79
  skill_config = skill_config
80
80
 
81
- # Get the Heurist API key from the skill store
81
+ # Get the Heurist API key from configuration
82
82
  if "api_key" in skill_config and skill_config["api_key"]:
83
83
  api_key = skill_config["api_key"]
84
84
  if skill_config.get("rate_limit_number") and skill_config.get(
85
85
  "rate_limit_minutes"
86
86
  ):
87
87
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
88
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
89
+ skill_config["rate_limit_minutes"] * 60,
91
90
  )
92
91
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
92
+ api_key = config.heurist_api_key
93
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
94
 
96
95
  # Generate a unique job ID
97
96
  job_id = str(XID())
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from epyxid import XID
6
5
  from pydantic import BaseModel, Field
7
6
 
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.heurist.base import HeuristBaseTool
9
9
  from intentkit.utils.s3 import store_image
10
10
 
@@ -17,16 +17,16 @@ class ImageGenerationSDXLInput(BaseModel):
17
17
  prompt: str = Field(
18
18
  description="Text prompt describing the image to generate.",
19
19
  )
20
- neg_prompt: Optional[str] = Field(
20
+ neg_prompt: str | None = Field(
21
21
  default="(worst quality: 1.4), bad quality, nsfw",
22
22
  description="Negative prompt describing what to avoid in the generated image.",
23
23
  )
24
- width: Optional[int] = Field(
24
+ width: int | None = Field(
25
25
  default=1024,
26
26
  le=1024,
27
27
  description="Width of the generated image.",
28
28
  )
29
- height: Optional[int] = Field(
29
+ height: int | None = Field(
30
30
  default=1024,
31
31
  le=1024,
32
32
  description="Height of the generated image.",
@@ -52,14 +52,14 @@ class ImageGenerationSDXL(HeuristBaseTool):
52
52
  "SDXL is a versatile, general-purpose model capable of generating high-quality images in any style.\n"
53
53
  "If you have height and width, remember to specify them.\n"
54
54
  )
55
- args_schema: Type[BaseModel] = ImageGenerationSDXLInput
55
+ args_schema: type[BaseModel] = ImageGenerationSDXLInput
56
56
 
57
57
  async def _arun(
58
58
  self,
59
59
  prompt: str,
60
- neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
61
- width: Optional[int] = 1024,
62
- height: Optional[int] = 680,
60
+ neg_prompt: str | None = "(worst quality: 1.4), bad quality, nsfw",
61
+ width: int | None = 1024,
62
+ height: int | None = 680,
63
63
  **kwargs,
64
64
  ) -> str:
65
65
  """Implementation of the tool to generate images using Heurist AI's SDXL model.
@@ -78,20 +78,19 @@ class ImageGenerationSDXL(HeuristBaseTool):
78
78
  skill_config = context.agent.skill_config(self.category)
79
79
  skill_config = skill_config
80
80
 
81
- # Get the Heurist API key from the skill store
81
+ # Get the Heurist API key from configuration
82
82
  if "api_key" in skill_config and skill_config["api_key"]:
83
83
  api_key = skill_config["api_key"]
84
84
  if skill_config.get("rate_limit_number") and skill_config.get(
85
85
  "rate_limit_minutes"
86
86
  ):
87
87
  await self.user_rate_limit_by_category(
88
- context.user_id,
89
88
  skill_config["rate_limit_number"],
90
- skill_config["rate_limit_minutes"],
89
+ skill_config["rate_limit_minutes"] * 60,
91
90
  )
92
91
  else:
93
- api_key = self.skill_store.get_system_config("heurist_api_key")
94
- await self.user_rate_limit_by_category(context.user_id, 10, 1440)
92
+ api_key = config.heurist_api_key
93
+ await self.user_rate_limit_by_category(10, 1440 * 60)
95
94
 
96
95
  # Generate a unique job ID
97
96
  job_id = str(XID())