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
@@ -1,192 +1,185 @@
1
- import logging
2
- from typing import Any, Dict, Optional, Tuple
3
-
4
- from langchain.tools.base import ToolException
5
- from pydantic import Field
6
-
7
- from intentkit.abstracts.skill import SkillStoreABC
8
- from intentkit.skills.base import IntentKitSkill
9
- from intentkit.skills.venice_image.api import (
10
- make_venice_api_request,
11
- )
12
- from intentkit.skills.venice_image.config import VeniceImageConfig
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- venice_base_url = "https://api.venice.ai" # Common base URL for all Venice endpoints
17
-
18
-
19
- class VeniceImageBaseTool(IntentKitSkill):
20
- """
21
- Base class for all Venice AI image-related skills.
22
-
23
- This class provides common functionality for interacting with the
24
- Venice AI API, including:
25
-
26
- - Retrieving the API key (from agent or system configuration).
27
- - Applying rate limits to prevent overuse of the API.
28
- - A standardized `post` method for making API requests.
29
-
30
- Subclasses should inherit from this class and implement their specific
31
- API interactions (e.g., image generation, upscaling, inpainting)
32
- by defining their own `_arun` methods and setting appropriate `name`
33
- and `description` attributes.
34
- """
35
-
36
- @property
37
- def category(self) -> str:
38
- """
39
- Returns the category of this skill, used for configuration and logging.
40
- """
41
- return "venice_image"
42
-
43
- skill_store: SkillStoreABC = Field(
44
- description="The skill store for persisting data and configs."
45
- )
46
-
47
- def getSkillConfig(self, context) -> VeniceImageConfig:
48
- """
49
- Creates a VeniceImageConfig instance from a dictionary of configuration values.
50
-
51
- Args:
52
- config: A dictionary containing configuration settings.
53
-
54
- Returns:
55
- A VeniceImageConfig object.
56
- """
57
-
58
- skill_config = context.agent.skill_config(self.category)
59
- return VeniceImageConfig(
60
- api_key_provider=skill_config.get("api_key_provider", "agent_owner"),
61
- safe_mode=skill_config.get("safe_mode", True),
62
- hide_watermark=skill_config.get("hide_watermark", True),
63
- embed_exif_metadata=skill_config.get("embed_exif_metadata", False),
64
- negative_prompt=skill_config.get(
65
- "negative_prompt", "(worst quality: 1.4), bad quality, nsfw"
66
- ),
67
- rate_limit_number=skill_config.get("rate_limit_number"),
68
- rate_limit_minutes=skill_config.get("rate_limit_minutes"),
69
- )
70
-
71
- def get_api_key(self) -> str:
72
- """
73
- Retrieves the Venice AI API key based on the api_key_provider setting.
74
-
75
- Returns:
76
- The API key if found.
77
-
78
- Raises:
79
- ToolException: If the API key is not found or provider is invalid.
80
- """
81
- try:
82
- context = self.get_context()
83
- skillConfig = self.getSkillConfig(context=context)
84
- if skillConfig.api_key_provider == "agent_owner":
85
- skill_config = context.agent.skill_config(self.category)
86
- agent_api_key = skill_config.get("api_key")
87
- if agent_api_key:
88
- logger.debug(
89
- f"Using agent-specific Venice API key for skill {self.name} in category {self.category}"
90
- )
91
- return agent_api_key
92
- raise ToolException(
93
- f"No agent-owned Venice API key found for skill '{self.name}' in category '{self.category}'."
94
- )
95
-
96
- elif skillConfig.api_key_provider == "platform":
97
- system_api_key = self.skill_store.get_system_config("venice_api_key")
98
- if system_api_key:
99
- logger.debug(
100
- f"Using system Venice API key for skill {self.name} in category {self.category}"
101
- )
102
- return system_api_key
103
- raise ToolException(
104
- f"No platform-hosted Venice API key found for skill '{self.name}' in category '{self.category}'."
105
- )
106
-
107
- else:
108
- raise ToolException(
109
- f"Invalid API key provider '{skillConfig.api_key_provider}' for skill '{self.name}'"
110
- )
111
-
112
- except Exception as e:
113
- raise ToolException(f"Failed to retrieve Venice API key: {str(e)}") from e
114
-
115
- async def apply_venice_rate_limit(self, context) -> None:
116
- """
117
- Applies rate limiting to prevent exceeding the Venice AI API's rate limits.
118
-
119
- Rate limits are applied based on the api_key_provider setting:
120
- - 'agent_owner': uses agent-specific configuration.
121
- - 'platform': uses system-wide configuration.
122
- """
123
- try:
124
- # Get user_id from the agent context (venice_image only supports agent_owner)
125
- skillConfig = self.getSkillConfig(context=context)
126
-
127
- if skillConfig.api_key_provider == "agent_owner":
128
- limit_num = skillConfig.rate_limit_number
129
- limit_min = skillConfig.rate_limit_minutes
130
-
131
- if limit_num and limit_min:
132
- # For agent_owner, use agent.id as user_id for rate limiting
133
- user_id = context.agent.id
134
- logger.debug(
135
- f"Applying Agent rate limit ({limit_num}/{limit_min} min) for user {user_id} on {self.name}"
136
- )
137
- await self.user_rate_limit_by_category(
138
- user_id, limit_num, limit_min
139
- )
140
-
141
- elif skillConfig.api_key_provider == "platform":
142
- system_limit_num = self.skill_store.get_system_config(
143
- f"{self.category}_rate_limit_number"
144
- )
145
- system_limit_min = self.skill_store.get_system_config(
146
- f"{self.category}_rate_limit_minutes"
147
- )
148
-
149
- if system_limit_num and system_limit_min:
150
- # For platform, use agent.id as user_id for rate limiting
151
- user_id = context.agent.id
152
- logger.debug(
153
- f"Applying System rate limit ({system_limit_num}/{system_limit_min} min) for user {user_id} on {self.name}"
154
- )
155
- await self.user_rate_limit_by_category(
156
- user_id, system_limit_num, system_limit_min
157
- )
158
- # do nothing if no rate limit is
159
- return None
160
-
161
- except Exception as e:
162
- raise ToolException(f"Failed to apply Venice rate limit: {str(e)}") from e
163
-
164
- async def post(
165
- self, path: str, payload: Dict[str, Any], context
166
- ) -> Tuple[Dict[str, Any], Optional[Dict[str, Any]]]:
167
- """
168
- Makes a POST request to the Venice AI API using the `make_venice_api_request`
169
- function from the `skills.venice_image.api` module.
170
-
171
- This method handles the following:
172
-
173
- 1. Retrieving the API key using `get_api_key`.
174
- 2. Constructing the request payload.
175
- 3. Calling `make_venice_api_request` to make the actual API call.
176
- 4. Returning the results from `make_venice_api_request`.
177
-
178
- Args:
179
- path: The API endpoint path (e.g., "/api/v1/image/generate").
180
- payload: The request payload as a dictionary.
181
- context: The SkillContext for accessing API keys and configs.
182
-
183
- Returns:
184
- A tuple: (success_data, error_data).
185
- - If successful, success contains the JSON response from the API.
186
- - If an error occurs, success is an empty dictionary, and error contains error details.
187
- """
188
- api_key = self.get_api_key()
189
-
190
- return await make_venice_api_request(
191
- api_key, path, payload, self.category, self.name
192
- )
1
+ import logging
2
+ from typing import Any
3
+
4
+ from langchain_core.tools.base import ToolException
5
+
6
+ from intentkit.config.config import config
7
+ from intentkit.skills.base import IntentKitSkill
8
+ from intentkit.skills.venice_image.api import (
9
+ make_venice_api_request,
10
+ )
11
+ from intentkit.skills.venice_image.config import VeniceImageConfig
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+ venice_base_url = "https://api.venice.ai" # Common base URL for all Venice endpoints
16
+
17
+
18
+ class VeniceImageBaseTool(IntentKitSkill):
19
+ """
20
+ Base class for all Venice AI image-related skills.
21
+
22
+ This class provides common functionality for interacting with the
23
+ Venice AI API, including:
24
+
25
+ - Retrieving the API key (from agent or system configuration).
26
+ - Applying rate limits to prevent overuse of the API.
27
+ - A standardized `post` method for making API requests.
28
+
29
+ Subclasses should inherit from this class and implement their specific
30
+ API interactions (e.g., image generation, upscaling, inpainting)
31
+ by defining their own `_arun` methods and setting appropriate `name`
32
+ and `description` attributes.
33
+ """
34
+
35
+ @property
36
+ def category(self) -> str:
37
+ """
38
+ Returns the category of this skill, used for configuration and logging.
39
+ """
40
+ return "venice_image"
41
+
42
+ def getSkillConfig(self, context) -> VeniceImageConfig:
43
+ """
44
+ Creates a VeniceImageConfig instance from a dictionary of configuration values.
45
+
46
+ Args:
47
+ config: A dictionary containing configuration settings.
48
+
49
+ Returns:
50
+ A VeniceImageConfig object.
51
+ """
52
+
53
+ skill_config = context.agent.skill_config(self.category)
54
+ return VeniceImageConfig(
55
+ api_key_provider=skill_config.get("api_key_provider", "agent_owner"),
56
+ safe_mode=skill_config.get("safe_mode", True),
57
+ hide_watermark=skill_config.get("hide_watermark", True),
58
+ embed_exif_metadata=skill_config.get("embed_exif_metadata", False),
59
+ negative_prompt=skill_config.get(
60
+ "negative_prompt", "(worst quality: 1.4), bad quality, nsfw"
61
+ ),
62
+ rate_limit_number=skill_config.get("rate_limit_number"),
63
+ rate_limit_minutes=skill_config.get("rate_limit_minutes"),
64
+ )
65
+
66
+ def get_api_key(self) -> str:
67
+ """
68
+ Retrieves the Venice AI API key based on the api_key_provider setting.
69
+
70
+ Returns:
71
+ The API key if found.
72
+
73
+ Raises:
74
+ ToolException: If the API key is not found or provider is invalid.
75
+ """
76
+ try:
77
+ context = self.get_context()
78
+ skillConfig = self.getSkillConfig(context=context)
79
+ if skillConfig.api_key_provider == "agent_owner":
80
+ skill_config = context.agent.skill_config(self.category)
81
+ agent_api_key = skill_config.get("api_key")
82
+ if agent_api_key:
83
+ logger.debug(
84
+ f"Using agent-specific Venice API key for skill {self.name} in category {self.category}"
85
+ )
86
+ return agent_api_key
87
+ raise ToolException(
88
+ f"No agent-owned Venice API key found for skill '{self.name}' in category '{self.category}'."
89
+ )
90
+
91
+ elif skillConfig.api_key_provider == "platform":
92
+ system_api_key = config.venice_api_key
93
+ if system_api_key:
94
+ logger.debug(
95
+ f"Using system Venice API key for skill {self.name} in category {self.category}"
96
+ )
97
+ return system_api_key
98
+ raise ToolException(
99
+ f"No platform-hosted Venice API key found for skill '{self.name}' in category '{self.category}'."
100
+ )
101
+
102
+ else:
103
+ raise ToolException(
104
+ f"Invalid API key provider '{skillConfig.api_key_provider}' for skill '{self.name}'"
105
+ )
106
+
107
+ except Exception as e:
108
+ raise ToolException(f"Failed to retrieve Venice API key: {str(e)}") from e
109
+
110
+ async def apply_venice_rate_limit(self, context) -> None:
111
+ """
112
+ Applies rate limiting to prevent exceeding the Venice AI API's rate limits.
113
+
114
+ Rate limits are applied based on the api_key_provider setting:
115
+ - 'agent_owner': uses agent-specific configuration.
116
+ - 'platform': uses system-wide configuration.
117
+ """
118
+ try:
119
+ # Get user_id from the agent context (venice_image only supports agent_owner)
120
+ skillConfig = self.getSkillConfig(context=context)
121
+
122
+ if skillConfig.api_key_provider == "agent_owner":
123
+ limit_num = skillConfig.rate_limit_number
124
+ limit_min = skillConfig.rate_limit_minutes
125
+
126
+ if limit_num and limit_min:
127
+ # For agent_owner, use agent.id as user_id for rate limiting
128
+ user_id = context.agent.id
129
+ logger.debug(
130
+ f"Applying Agent rate limit ({limit_num}/{limit_min} min) for user {user_id} on {self.name}"
131
+ )
132
+ await self.user_rate_limit_by_category(limit_num, limit_min * 60)
133
+
134
+ elif skillConfig.api_key_provider == "platform":
135
+ system_limit_num = getattr(
136
+ config, f"{self.category}_rate_limit_number", None
137
+ )
138
+ system_limit_min = getattr(
139
+ config, f"{self.category}_rate_limit_minutes", None
140
+ )
141
+
142
+ if system_limit_num and system_limit_min:
143
+ # For platform, use agent.id as user_id for rate limiting
144
+ user_id = context.agent.id
145
+ logger.debug(
146
+ f"Applying System rate limit ({system_limit_num}/{system_limit_min} min) for user {user_id} on {self.name}"
147
+ )
148
+ await self.user_rate_limit_by_category(
149
+ system_limit_num, system_limit_min * 60
150
+ )
151
+ # do nothing if no rate limit is
152
+ return None
153
+
154
+ except Exception as e:
155
+ raise ToolException(f"Failed to apply Venice rate limit: {str(e)}") from e
156
+
157
+ async def post(
158
+ self, path: str, payload: dict[str, Any], context
159
+ ) -> tuple[dict[str, Any], dict[str, Any] | None]:
160
+ """
161
+ Makes a POST request to the Venice AI API using the `make_venice_api_request`
162
+ function from the `skills.venice_image.api` module.
163
+
164
+ This method handles the following:
165
+
166
+ 1. Retrieving the API key using `get_api_key`.
167
+ 2. Constructing the request payload.
168
+ 3. Calling `make_venice_api_request` to make the actual API call.
169
+ 4. Returning the results from `make_venice_api_request`.
170
+
171
+ Args:
172
+ path: The API endpoint path (e.g., "/api/v1/image/generate").
173
+ payload: The request payload as a dictionary.
174
+ context: The SkillContext for accessing API keys and configs.
175
+
176
+ Returns:
177
+ A tuple: (success_data, error_data).
178
+ - If successful, success contains the JSON response from the API.
179
+ - If an error occurs, success is an empty dictionary, and error contains error details.
180
+ """
181
+ api_key = self.get_api_key()
182
+
183
+ return await make_venice_api_request(
184
+ api_key, path, payload, self.category, self.name
185
+ )
@@ -1,35 +1,33 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel, Field
4
-
5
-
6
- class VeniceImageConfig(BaseModel):
7
- """Skill Config for Venice Image."""
8
-
9
- api_key_provider: str = Field(
10
- default="agent_owner",
11
- description="Provider of the API Key, could be agent_owner or platform",
12
- )
13
- safe_mode: bool = Field(
14
- default=True,
15
- description="Whether to use safe mode. If enabled, this will blur images that are classified as having adult content",
16
- )
17
- hide_watermark: bool = Field(
18
- default=True,
19
- description="Whether to hide the Venice watermark. Venice may ignore this parameter for certain generated content.",
20
- )
21
- embed_exif_metadata: bool = Field(
22
- default=False, description="Whether to embed EXIF metadata in the image."
23
- )
24
- negative_prompt: str = Field(
25
- default="(worst quality: 1.4), bad quality, nsfw",
26
- description="The default negative prompt used when no other prompt is provided.",
27
- )
28
- rate_limit_number: Optional[int] = Field(
29
- default=None,
30
- description="Maximum number of allowed calls within the specified time window.",
31
- )
32
- rate_limit_minutes: Optional[int] = Field(
33
- default=None,
34
- description="Duration of the time window (in minutes) for rate limiting.",
35
- )
1
+ from pydantic import BaseModel, Field
2
+
3
+
4
+ class VeniceImageConfig(BaseModel):
5
+ """Skill Config for Venice Image."""
6
+
7
+ api_key_provider: str = Field(
8
+ default="agent_owner",
9
+ description="Provider of the API Key, could be agent_owner or platform",
10
+ )
11
+ safe_mode: bool = Field(
12
+ default=True,
13
+ description="Whether to use safe mode. If enabled, this will blur images that are classified as having adult content",
14
+ )
15
+ hide_watermark: bool = Field(
16
+ default=True,
17
+ description="Whether to hide the Venice watermark. Venice may ignore this parameter for certain generated content.",
18
+ )
19
+ embed_exif_metadata: bool = Field(
20
+ default=False, description="Whether to embed EXIF metadata in the image."
21
+ )
22
+ negative_prompt: str = Field(
23
+ default="(worst quality: 1.4), bad quality, nsfw",
24
+ description="The default negative prompt used when no other prompt is provided.",
25
+ )
26
+ rate_limit_number: int | None = Field(
27
+ default=None,
28
+ description="Maximum number of allowed calls within the specified time window.",
29
+ )
30
+ rate_limit_minutes: int | None = Field(
31
+ default=None,
32
+ description="Duration of the time window (in minutes) for rate limiting.",
33
+ )
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Optional
3
2
 
4
3
  from pydantic import HttpUrl
5
4
 
@@ -30,8 +29,8 @@ class ImageEnhance(VeniceImageEnhanceBaseTool):
30
29
  self,
31
30
  image_url: HttpUrl,
32
31
  enhancePrompt: str,
33
- replication: Optional[float] = 0.35,
34
- enhanceCreativity: Optional[float] = 0.5,
32
+ replication: float | None = 0.35,
33
+ enhanceCreativity: float | None = 0.5,
35
34
  **kwargs,
36
35
  ) -> dict:
37
36
  """
@@ -1,23 +1,21 @@
1
- from typing import Type
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- # Import the generic base and shared input
6
- from intentkit.skills.venice_image.base import VeniceImageBaseTool
7
- from intentkit.skills.venice_image.image_enhance.image_enhance_input import (
8
- VeniceImageEnhanceInput,
9
- )
10
-
11
-
12
- class VeniceImageEnhanceBaseTool(VeniceImageBaseTool):
13
- """
14
- Base class for Venice AI *Image Enchanching* tools.
15
- Inherits from VeniceAIBaseTool and handles specifics of the
16
- /image/upscale endpoint
17
- """
18
-
19
- args_schema: Type[BaseModel] = VeniceImageEnhanceInput
20
- name: str = Field(description="The unique name of the image Enchanching tool.")
21
- description: str = Field(
22
- description="A description of what the image Enchanching tool does."
23
- )
1
+ from pydantic import BaseModel, Field
2
+
3
+ # Import the generic base and shared input
4
+ from intentkit.skills.venice_image.base import VeniceImageBaseTool
5
+ from intentkit.skills.venice_image.image_enhance.image_enhance_input import (
6
+ VeniceImageEnhanceInput,
7
+ )
8
+
9
+
10
+ class VeniceImageEnhanceBaseTool(VeniceImageBaseTool):
11
+ """
12
+ Base class for Venice AI *Image Enchanching* tools.
13
+ Inherits from VeniceAIBaseTool and handles specifics of the
14
+ /image/upscale endpoint
15
+ """
16
+
17
+ args_schema: type[BaseModel] = VeniceImageEnhanceInput
18
+ name: str = Field(description="The unique name of the image Enchanching tool.")
19
+ description: str = Field(
20
+ description="A description of what the image Enchanching tool does."
21
+ )
@@ -1,40 +1,38 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel, Field
4
-
5
-
6
- class VeniceImageEnhanceInput(BaseModel):
7
- """Input for Venice Image Enhance tool (scale=1, enhance=True)."""
8
-
9
- image_url: str = Field(
10
- description="The URL of the image to enhance. Must be a publicly accessible URL."
11
- )
12
-
13
- enhancePrompt: str = Field(
14
- ...,
15
- max_length=1500,
16
- description=(
17
- "Required prompt describing the desired enhancement style. "
18
- "Best used with short descriptors like 'gold', 'marble', or 'angry, menacing'."
19
- ),
20
- )
21
-
22
- replication: Optional[float] = Field(
23
- default=0.35,
24
- ge=0.1,
25
- le=1.0,
26
- description=(
27
- "How strongly lines and noise in the base image are preserved. "
28
- "Higher values retain more noise and detail but are less smooth."
29
- ),
30
- )
31
-
32
- enhanceCreativity: float = Field(
33
- default=0.5,
34
- ge=0.0,
35
- le=1.0,
36
- description=(
37
- "How much the enhancement AI is allowed to change the image. "
38
- "0 = minimal change, 1 = generate a new image entirely."
39
- ),
40
- )
1
+ from pydantic import BaseModel, Field
2
+
3
+
4
+ class VeniceImageEnhanceInput(BaseModel):
5
+ """Input for Venice Image Enhance tool (scale=1, enhance=True)."""
6
+
7
+ image_url: str = Field(
8
+ description="The URL of the image to enhance. Must be a publicly accessible URL."
9
+ )
10
+
11
+ enhancePrompt: str = Field(
12
+ ...,
13
+ max_length=1500,
14
+ description=(
15
+ "Required prompt describing the desired enhancement style. "
16
+ "Best used with short descriptors like 'gold', 'marble', or 'angry, menacing'."
17
+ ),
18
+ )
19
+
20
+ replication: float | None = Field(
21
+ default=0.35,
22
+ ge=0.1,
23
+ le=1.0,
24
+ description=(
25
+ "How strongly lines and noise in the base image are preserved. "
26
+ "Higher values retain more noise and detail but are less smooth."
27
+ ),
28
+ )
29
+
30
+ enhanceCreativity: float = Field(
31
+ default=0.5,
32
+ ge=0.0,
33
+ le=1.0,
34
+ description=(
35
+ "How much the enhancement AI is allowed to change the image. "
36
+ "0 = minimal change, 1 = generate a new image entirely."
37
+ ),
38
+ )
@@ -1,7 +1,7 @@
1
1
  import base64
2
2
  import hashlib
3
3
  import logging
4
- from typing import Any, Dict, Literal, Optional, Type
4
+ from typing import Any, Literal
5
5
 
6
6
  from pydantic import BaseModel, Field
7
7
 
@@ -24,7 +24,7 @@ class VeniceImageGenerationBaseTool(VeniceImageBaseTool):
24
24
  """
25
25
 
26
26
  # --- Attributes specific to Image Generation ---
27
- args_schema: Type[BaseModel] = VeniceImageGenerationInput
27
+ args_schema: type[BaseModel] = VeniceImageGenerationInput
28
28
 
29
29
  # --- Attributes Subclasses MUST Define ---
30
30
  name: str = Field(description="The unique name of the image generation tool/model.")
@@ -38,15 +38,15 @@ class VeniceImageGenerationBaseTool(VeniceImageBaseTool):
38
38
  async def _arun(
39
39
  self,
40
40
  prompt: str,
41
- seed: Optional[int] = None,
42
- negative_prompt: Optional[str] = None,
43
- width: Optional[int] = 1024,
44
- height: Optional[int] = 1024,
41
+ seed: int | None = None,
42
+ negative_prompt: str | None = None,
43
+ width: int | None = 1024,
44
+ height: int | None = 1024,
45
45
  format: Literal["png", "jpeg", "webp"] = "png",
46
- cfg_scale: Optional[float] = 7.5,
47
- style_preset: Optional[str] = "Photographic",
46
+ cfg_scale: float | None = 7.5,
47
+ style_preset: str | None = "Photographic",
48
48
  **kwargs,
49
- ) -> Dict[str, Any]:
49
+ ) -> dict[str, Any]:
50
50
  try:
51
51
  context = self.get_context()
52
52
  skillConfig = self.getSkillConfig(context)