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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. intentkit/MANIFEST.in +14 -0
  2. intentkit/README.md +88 -0
  3. intentkit/__init__.py +6 -4
  4. intentkit/abstracts/agent.py +4 -5
  5. intentkit/abstracts/engine.py +5 -5
  6. intentkit/abstracts/graph.py +15 -8
  7. intentkit/abstracts/skill.py +6 -144
  8. intentkit/abstracts/twitter.py +4 -5
  9. intentkit/clients/__init__.py +9 -2
  10. intentkit/clients/cdp.py +129 -153
  11. intentkit/{utils → clients}/s3.py +109 -34
  12. intentkit/clients/twitter.py +83 -62
  13. intentkit/clients/web3.py +4 -7
  14. intentkit/config/config.py +123 -90
  15. intentkit/core/account_checking.py +802 -0
  16. intentkit/core/agent.py +313 -498
  17. intentkit/core/asset.py +267 -0
  18. intentkit/core/chat.py +5 -3
  19. intentkit/core/client.py +1 -1
  20. intentkit/core/credit.py +49 -41
  21. intentkit/core/draft.py +201 -0
  22. intentkit/core/draft_chat.py +118 -0
  23. intentkit/core/engine.py +378 -287
  24. intentkit/core/manager/__init__.py +25 -0
  25. intentkit/core/manager/engine.py +220 -0
  26. intentkit/core/manager/service.py +172 -0
  27. intentkit/core/manager/skills.py +178 -0
  28. intentkit/core/middleware.py +231 -0
  29. intentkit/core/prompt.py +74 -114
  30. intentkit/core/scheduler.py +143 -0
  31. intentkit/core/statistics.py +168 -0
  32. intentkit/models/agent.py +931 -518
  33. intentkit/models/agent_data.py +165 -106
  34. intentkit/models/agent_schema.json +38 -251
  35. intentkit/models/app_setting.py +15 -13
  36. intentkit/models/chat.py +86 -140
  37. intentkit/models/credit.py +182 -162
  38. intentkit/models/db.py +42 -23
  39. intentkit/models/db_mig.py +120 -3
  40. intentkit/models/draft.py +222 -0
  41. intentkit/models/llm.csv +31 -0
  42. intentkit/models/llm.py +262 -370
  43. intentkit/models/redis.py +6 -4
  44. intentkit/models/skill.py +222 -101
  45. intentkit/models/skills.csv +173 -0
  46. intentkit/models/team.py +189 -0
  47. intentkit/models/user.py +103 -31
  48. intentkit/skills/acolyt/__init__.py +2 -9
  49. intentkit/skills/acolyt/ask.py +3 -4
  50. intentkit/skills/acolyt/base.py +4 -9
  51. intentkit/skills/acolyt/schema.json +4 -3
  52. intentkit/skills/aixbt/__init__.py +2 -13
  53. intentkit/skills/aixbt/base.py +1 -7
  54. intentkit/skills/aixbt/projects.py +14 -15
  55. intentkit/skills/aixbt/schema.json +4 -4
  56. intentkit/skills/allora/__init__.py +2 -9
  57. intentkit/skills/allora/base.py +4 -9
  58. intentkit/skills/allora/price.py +3 -4
  59. intentkit/skills/allora/schema.json +3 -2
  60. intentkit/skills/base.py +241 -41
  61. intentkit/skills/basename/__init__.py +51 -0
  62. intentkit/skills/basename/base.py +11 -0
  63. intentkit/skills/basename/basename.svg +11 -0
  64. intentkit/skills/basename/schema.json +58 -0
  65. intentkit/skills/carv/__init__.py +115 -121
  66. intentkit/skills/carv/base.py +184 -185
  67. intentkit/skills/carv/fetch_news.py +3 -3
  68. intentkit/skills/carv/onchain_query.py +4 -4
  69. intentkit/skills/carv/schema.json +134 -137
  70. intentkit/skills/carv/token_info_and_price.py +6 -6
  71. intentkit/skills/casino/__init__.py +4 -15
  72. intentkit/skills/casino/base.py +1 -7
  73. intentkit/skills/casino/deck_draw.py +5 -8
  74. intentkit/skills/casino/deck_shuffle.py +6 -6
  75. intentkit/skills/casino/dice_roll.py +2 -4
  76. intentkit/skills/casino/schema.json +0 -1
  77. intentkit/skills/cdp/__init__.py +22 -84
  78. intentkit/skills/cdp/base.py +1 -7
  79. intentkit/skills/cdp/schema.json +11 -314
  80. intentkit/skills/chainlist/__init__.py +2 -7
  81. intentkit/skills/chainlist/base.py +1 -7
  82. intentkit/skills/chainlist/chain_lookup.py +18 -18
  83. intentkit/skills/chainlist/schema.json +3 -5
  84. intentkit/skills/common/__init__.py +2 -9
  85. intentkit/skills/common/base.py +1 -7
  86. intentkit/skills/common/current_time.py +1 -2
  87. intentkit/skills/common/schema.json +2 -2
  88. intentkit/skills/cookiefun/__init__.py +6 -9
  89. intentkit/skills/cookiefun/base.py +2 -7
  90. intentkit/skills/cookiefun/get_account_details.py +7 -7
  91. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  92. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  93. intentkit/skills/cookiefun/get_sectors.py +3 -3
  94. intentkit/skills/cookiefun/schema.json +1 -3
  95. intentkit/skills/cookiefun/search_accounts.py +9 -9
  96. intentkit/skills/cryptocompare/__init__.py +7 -24
  97. intentkit/skills/cryptocompare/api.py +2 -3
  98. intentkit/skills/cryptocompare/base.py +10 -24
  99. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  100. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  101. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  102. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  103. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  104. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  105. intentkit/skills/cryptocompare/schema.json +3 -3
  106. intentkit/skills/cryptopanic/__init__.py +7 -10
  107. intentkit/skills/cryptopanic/base.py +51 -55
  108. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  109. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  110. intentkit/skills/cryptopanic/schema.json +105 -103
  111. intentkit/skills/dapplooker/__init__.py +2 -9
  112. intentkit/skills/dapplooker/base.py +4 -9
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  114. intentkit/skills/dapplooker/schema.json +3 -5
  115. intentkit/skills/defillama/__init__.py +24 -74
  116. intentkit/skills/defillama/api.py +6 -9
  117. intentkit/skills/defillama/base.py +8 -19
  118. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  119. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  120. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  121. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  122. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  123. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  124. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  125. intentkit/skills/defillama/config/chains.py +1 -3
  126. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  127. intentkit/skills/defillama/schema.json +5 -1
  128. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  129. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  130. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  131. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  132. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  133. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  134. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  135. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  136. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  137. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  138. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  139. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  140. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  141. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  142. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  143. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  144. intentkit/skills/dexscreener/__init__.py +97 -102
  145. intentkit/skills/dexscreener/base.py +125 -130
  146. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  147. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  148. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  149. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  150. intentkit/skills/dexscreener/schema.json +91 -93
  151. intentkit/skills/dexscreener/search_token.py +182 -184
  152. intentkit/skills/dexscreener/utils.py +15 -14
  153. intentkit/skills/dune_analytics/__init__.py +7 -9
  154. intentkit/skills/dune_analytics/base.py +48 -52
  155. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  156. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  157. intentkit/skills/dune_analytics/schema.json +104 -99
  158. intentkit/skills/elfa/__init__.py +5 -18
  159. intentkit/skills/elfa/base.py +10 -14
  160. intentkit/skills/elfa/mention.py +19 -21
  161. intentkit/skills/elfa/schema.json +3 -2
  162. intentkit/skills/elfa/stats.py +4 -4
  163. intentkit/skills/elfa/tokens.py +12 -12
  164. intentkit/skills/elfa/utils.py +26 -28
  165. intentkit/skills/enso/__init__.py +11 -31
  166. intentkit/skills/enso/base.py +54 -35
  167. intentkit/skills/enso/best_yield.py +16 -24
  168. intentkit/skills/enso/networks.py +6 -11
  169. intentkit/skills/enso/prices.py +11 -13
  170. intentkit/skills/enso/route.py +34 -38
  171. intentkit/skills/enso/schema.json +3 -2
  172. intentkit/skills/enso/tokens.py +29 -38
  173. intentkit/skills/enso/wallet.py +76 -191
  174. intentkit/skills/erc20/__init__.py +50 -0
  175. intentkit/skills/erc20/base.py +11 -0
  176. intentkit/skills/erc20/erc20.svg +5 -0
  177. intentkit/skills/erc20/schema.json +74 -0
  178. intentkit/skills/erc721/__init__.py +53 -0
  179. intentkit/skills/erc721/base.py +11 -0
  180. intentkit/skills/erc721/erc721.svg +5 -0
  181. intentkit/skills/erc721/schema.json +90 -0
  182. intentkit/skills/firecrawl/__init__.py +5 -18
  183. intentkit/skills/firecrawl/base.py +4 -9
  184. intentkit/skills/firecrawl/clear.py +4 -8
  185. intentkit/skills/firecrawl/crawl.py +19 -19
  186. intentkit/skills/firecrawl/query.py +4 -3
  187. intentkit/skills/firecrawl/schema.json +2 -6
  188. intentkit/skills/firecrawl/scrape.py +17 -22
  189. intentkit/skills/firecrawl/utils.py +50 -42
  190. intentkit/skills/github/__init__.py +2 -7
  191. intentkit/skills/github/base.py +1 -7
  192. intentkit/skills/github/github_search.py +1 -2
  193. intentkit/skills/github/schema.json +3 -4
  194. intentkit/skills/heurist/__init__.py +8 -27
  195. intentkit/skills/heurist/base.py +4 -9
  196. intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
  197. intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
  198. intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
  199. intentkit/skills/heurist/image_generation_braindance.py +13 -15
  200. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
  201. intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
  202. intentkit/skills/heurist/image_generation_sdxl.py +13 -15
  203. intentkit/skills/heurist/schema.json +2 -2
  204. intentkit/skills/http/__init__.py +4 -15
  205. intentkit/skills/http/base.py +1 -7
  206. intentkit/skills/http/get.py +21 -16
  207. intentkit/skills/http/post.py +23 -18
  208. intentkit/skills/http/put.py +23 -18
  209. intentkit/skills/http/schema.json +4 -5
  210. intentkit/skills/lifi/__init__.py +8 -13
  211. intentkit/skills/lifi/base.py +3 -9
  212. intentkit/skills/lifi/schema.json +17 -8
  213. intentkit/skills/lifi/token_execute.py +150 -60
  214. intentkit/skills/lifi/token_quote.py +8 -10
  215. intentkit/skills/lifi/utils.py +104 -51
  216. intentkit/skills/moralis/__init__.py +6 -10
  217. intentkit/skills/moralis/api.py +6 -7
  218. intentkit/skills/moralis/base.py +5 -10
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  223. intentkit/skills/moralis/schema.json +7 -2
  224. intentkit/skills/morpho/__init__.py +52 -0
  225. intentkit/skills/morpho/base.py +11 -0
  226. intentkit/skills/morpho/morpho.svg +12 -0
  227. intentkit/skills/morpho/schema.json +73 -0
  228. intentkit/skills/nation/__init__.py +4 -9
  229. intentkit/skills/nation/base.py +5 -10
  230. intentkit/skills/nation/nft_check.py +3 -4
  231. intentkit/skills/nation/schema.json +4 -3
  232. intentkit/skills/onchain.py +30 -0
  233. intentkit/skills/openai/__init__.py +17 -18
  234. intentkit/skills/openai/base.py +10 -14
  235. intentkit/skills/openai/dalle_image_generation.py +4 -9
  236. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  237. intentkit/skills/openai/gpt_image_generation.py +5 -9
  238. intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
  239. intentkit/skills/openai/gpt_image_to_image.py +5 -9
  240. intentkit/skills/openai/image_to_text.py +3 -7
  241. intentkit/skills/openai/schema.json +34 -3
  242. intentkit/skills/portfolio/__init__.py +11 -35
  243. intentkit/skills/portfolio/base.py +33 -19
  244. intentkit/skills/portfolio/schema.json +3 -5
  245. intentkit/skills/portfolio/token_balances.py +21 -21
  246. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  247. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  248. intentkit/skills/portfolio/wallet_history.py +31 -31
  249. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  250. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  251. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  252. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  253. intentkit/skills/portfolio/wallet_stats.py +3 -3
  254. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  255. intentkit/skills/pyth/__init__.py +50 -0
  256. intentkit/skills/pyth/base.py +11 -0
  257. intentkit/skills/pyth/pyth.svg +6 -0
  258. intentkit/skills/pyth/schema.json +75 -0
  259. intentkit/skills/skills.toml +36 -0
  260. intentkit/skills/slack/__init__.py +5 -17
  261. intentkit/skills/slack/base.py +3 -9
  262. intentkit/skills/slack/get_channel.py +8 -8
  263. intentkit/skills/slack/get_message.py +9 -9
  264. intentkit/skills/slack/schedule_message.py +5 -5
  265. intentkit/skills/slack/schema.json +2 -2
  266. intentkit/skills/slack/send_message.py +3 -5
  267. intentkit/skills/supabase/__init__.py +7 -23
  268. intentkit/skills/supabase/base.py +1 -7
  269. intentkit/skills/supabase/delete_data.py +4 -4
  270. intentkit/skills/supabase/fetch_data.py +12 -12
  271. intentkit/skills/supabase/insert_data.py +4 -4
  272. intentkit/skills/supabase/invoke_function.py +6 -6
  273. intentkit/skills/supabase/schema.json +2 -3
  274. intentkit/skills/supabase/update_data.py +6 -6
  275. intentkit/skills/supabase/upsert_data.py +4 -4
  276. intentkit/skills/superfluid/__init__.py +53 -0
  277. intentkit/skills/superfluid/base.py +11 -0
  278. intentkit/skills/superfluid/schema.json +89 -0
  279. intentkit/skills/superfluid/superfluid.svg +6 -0
  280. intentkit/skills/system/__init__.py +7 -24
  281. intentkit/skills/system/add_autonomous_task.py +10 -12
  282. intentkit/skills/system/delete_autonomous_task.py +2 -2
  283. intentkit/skills/system/edit_autonomous_task.py +14 -18
  284. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  285. intentkit/skills/system/read_agent_api_key.py +6 -4
  286. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  287. intentkit/skills/system/schema.json +6 -8
  288. intentkit/skills/tavily/__init__.py +3 -12
  289. intentkit/skills/tavily/base.py +4 -9
  290. intentkit/skills/tavily/schema.json +3 -5
  291. intentkit/skills/tavily/tavily_extract.py +2 -4
  292. intentkit/skills/tavily/tavily_search.py +4 -6
  293. intentkit/skills/token/__init__.py +5 -10
  294. intentkit/skills/token/base.py +7 -11
  295. intentkit/skills/token/erc20_transfers.py +19 -19
  296. intentkit/skills/token/schema.json +3 -6
  297. intentkit/skills/token/token_analytics.py +3 -3
  298. intentkit/skills/token/token_price.py +13 -13
  299. intentkit/skills/token/token_search.py +9 -9
  300. intentkit/skills/twitter/__init__.py +11 -35
  301. intentkit/skills/twitter/base.py +22 -34
  302. intentkit/skills/twitter/follow_user.py +2 -6
  303. intentkit/skills/twitter/get_mentions.py +5 -12
  304. intentkit/skills/twitter/get_timeline.py +4 -12
  305. intentkit/skills/twitter/get_user_by_username.py +2 -6
  306. intentkit/skills/twitter/get_user_tweets.py +5 -13
  307. intentkit/skills/twitter/like_tweet.py +2 -6
  308. intentkit/skills/twitter/post_tweet.py +6 -9
  309. intentkit/skills/twitter/reply_tweet.py +6 -9
  310. intentkit/skills/twitter/retweet.py +2 -6
  311. intentkit/skills/twitter/schema.json +1 -0
  312. intentkit/skills/twitter/search_tweets.py +4 -12
  313. intentkit/skills/unrealspeech/__init__.py +2 -7
  314. intentkit/skills/unrealspeech/base.py +2 -8
  315. intentkit/skills/unrealspeech/schema.json +2 -5
  316. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  317. intentkit/skills/venice_audio/__init__.py +98 -106
  318. intentkit/skills/venice_audio/base.py +117 -121
  319. intentkit/skills/venice_audio/input.py +41 -41
  320. intentkit/skills/venice_audio/schema.json +151 -152
  321. intentkit/skills/venice_audio/venice_audio.py +38 -21
  322. intentkit/skills/venice_image/__init__.py +147 -154
  323. intentkit/skills/venice_image/api.py +138 -138
  324. intentkit/skills/venice_image/base.py +185 -192
  325. intentkit/skills/venice_image/config.py +33 -35
  326. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  327. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  328. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  329. intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
  330. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  332. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  333. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  334. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  335. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  336. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  337. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  338. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  339. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  340. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  341. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  344. intentkit/skills/venice_image/schema.json +267 -267
  345. intentkit/skills/venice_image/utils.py +77 -78
  346. intentkit/skills/web_scraper/__init__.py +5 -18
  347. intentkit/skills/web_scraper/base.py +21 -7
  348. intentkit/skills/web_scraper/document_indexer.py +7 -6
  349. intentkit/skills/web_scraper/schema.json +2 -6
  350. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  351. intentkit/skills/web_scraper/utils.py +62 -63
  352. intentkit/skills/web_scraper/website_indexer.py +17 -19
  353. intentkit/skills/weth/__init__.py +49 -0
  354. intentkit/skills/weth/base.py +11 -0
  355. intentkit/skills/weth/schema.json +58 -0
  356. intentkit/skills/weth/weth.svg +6 -0
  357. intentkit/skills/wow/__init__.py +51 -0
  358. intentkit/skills/wow/base.py +11 -0
  359. intentkit/skills/wow/schema.json +89 -0
  360. intentkit/skills/wow/wow.svg +7 -0
  361. intentkit/skills/x402/__init__.py +58 -0
  362. intentkit/skills/x402/base.py +99 -0
  363. intentkit/skills/x402/http_request.py +117 -0
  364. intentkit/skills/x402/schema.json +40 -0
  365. intentkit/skills/x402/x402.webp +0 -0
  366. intentkit/skills/xmtp/__init__.py +4 -15
  367. intentkit/skills/xmtp/base.py +5 -5
  368. intentkit/skills/xmtp/price.py +7 -6
  369. intentkit/skills/xmtp/schema.json +69 -71
  370. intentkit/skills/xmtp/swap.py +6 -8
  371. intentkit/skills/xmtp/transfer.py +4 -6
  372. intentkit/utils/__init__.py +4 -0
  373. intentkit/utils/chain.py +198 -96
  374. intentkit/utils/ens.py +135 -0
  375. intentkit/utils/error.py +5 -2
  376. intentkit/utils/logging.py +9 -11
  377. intentkit/utils/schema.py +100 -0
  378. intentkit/utils/slack_alert.py +8 -8
  379. intentkit/utils/tx.py +16 -8
  380. intentkit/uv.lock +3377 -0
  381. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
  382. intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
  383. intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
  384. intentkit/core/node.py +0 -215
  385. intentkit/models/conversation.py +0 -286
  386. intentkit/models/generator.py +0 -347
  387. intentkit/skills/cdp/get_balance.py +0 -110
  388. intentkit/skills/cdp/swap.py +0 -121
  389. intentkit/skills/moralis/tests/__init__.py +0 -0
  390. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  391. intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
  392. {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
  393. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
@@ -1,7 +1,6 @@
1
1
  """fetching Solana wallet portfolio."""
2
2
 
3
3
  import logging
4
- from typing import Dict, List, Optional, Type
5
4
 
6
5
  from pydantic import BaseModel, Field
7
6
 
@@ -48,17 +47,17 @@ class SolanaTokenBalance(BaseModel):
48
47
  token_info: SolanaTokenInfo
49
48
  amount: float
50
49
  amount_raw: str
51
- usd_value: Optional[float] = 0.0
50
+ usd_value: float | None = 0.0
52
51
 
53
52
 
54
53
  class SolanaNftInfo(BaseModel):
55
54
  """Model for Solana NFT information."""
56
55
 
57
56
  mint: str
58
- name: Optional[str] = None
59
- symbol: Optional[str] = None
57
+ name: str | None = None
58
+ symbol: str | None = None
60
59
  associated_token_address: str
61
- metadata: Optional[Dict] = None
60
+ metadata: dict | None = None
62
61
 
63
62
 
64
63
  class SolanaPortfolioOutput(BaseModel):
@@ -67,12 +66,12 @@ class SolanaPortfolioOutput(BaseModel):
67
66
  address: str
68
67
  sol_balance: float
69
68
  sol_balance_lamports: int
70
- sol_price_usd: Optional[float] = None
71
- sol_value_usd: Optional[float] = None
72
- tokens: List[SolanaTokenBalance] = []
73
- nfts: List[SolanaNftInfo] = []
69
+ sol_price_usd: float | None = None
70
+ sol_value_usd: float | None = None
71
+ tokens: list[SolanaTokenBalance] = []
72
+ nfts: list[SolanaNftInfo] = []
74
73
  total_value_usd: float = 0.0
75
- error: Optional[str] = None
74
+ error: str | None = None
76
75
 
77
76
 
78
77
  class FetchSolanaPortfolio(WalletBaseTool):
@@ -91,7 +90,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
91
90
  "- USD values of assets\n"
92
91
  "Use this tool whenever the user asks specifically about Solana holdings."
93
92
  )
94
- args_schema: Type[BaseModel] = SolanaPortfolioInput
93
+ args_schema: type[BaseModel] = SolanaPortfolioInput
95
94
 
96
95
  async def _arun(
97
96
  self,
@@ -136,7 +135,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
136
135
  self,
137
136
  address: str,
138
137
  network: str,
139
- sol_portfolio: Dict,
138
+ sol_portfolio: dict,
140
139
  include_nfts: bool,
141
140
  include_price_data: bool,
142
141
  ) -> SolanaPortfolioOutput:
@@ -1,7 +1,6 @@
1
1
  """fetching a complete wallet portfolio (EVM + Solana)."""
2
2
 
3
3
  import logging
4
- from typing import Dict, List, Optional, Type
5
4
 
6
5
  from pydantic import BaseModel, Field
7
6
 
@@ -24,7 +23,7 @@ class FetchWalletPortfolioInput(BaseModel):
24
23
  address: str = Field(
25
24
  ..., description="Wallet address to analyze (Ethereum or Solana)"
26
25
  )
27
- chains: Optional[List[int]] = Field(
26
+ chains: list[int] | None = Field(
28
27
  default=None,
29
28
  description="List of EVM chain IDs to check (default: all supported)",
30
29
  )
@@ -51,9 +50,9 @@ class PortfolioOutput(BaseModel):
51
50
 
52
51
  address: str
53
52
  total_net_worth: float
54
- chains: Dict[str, float]
55
- tokens: List[TokenBalance]
56
- error: Optional[str] = None
53
+ chains: dict[str, float]
54
+ tokens: list[TokenBalance]
55
+ error: str | None = None
57
56
 
58
57
 
59
58
  class FetchWalletPortfolio(WalletBaseTool):
@@ -73,12 +72,12 @@ class FetchWalletPortfolio(WalletBaseTool):
73
72
  "Use this tool whenever the user asks about their crypto holdings, portfolio value, "
74
73
  "or wallet contents across multiple blockchains."
75
74
  )
76
- args_schema: Type[BaseModel] = FetchWalletPortfolioInput
75
+ args_schema: type[BaseModel] = FetchWalletPortfolioInput
77
76
 
78
77
  async def _arun(
79
78
  self,
80
79
  address: str,
81
- chains: Optional[List[int]] = None,
80
+ chains: list[int] | None = None,
82
81
  include_solana: bool = True,
83
82
  solana_network: str = "mainnet",
84
83
  **kwargs,
@@ -119,7 +118,7 @@ class FetchWalletPortfolio(WalletBaseTool):
119
118
  )
120
119
 
121
120
  async def _fetch_evm_portfolio(
122
- self, address: str, chains: Optional[List[int]], portfolio: Dict
121
+ self, address: str, chains: list[int] | None, portfolio: dict
123
122
  ) -> None:
124
123
  """Fetch portfolio data for EVM chains.
125
124
 
@@ -165,7 +164,7 @@ class FetchWalletPortfolio(WalletBaseTool):
165
164
  )
166
165
 
167
166
  async def _fetch_solana_portfolio(
168
- self, address: str, network: str, portfolio: Dict
167
+ self, address: str, network: str, portfolio: dict
169
168
  ) -> None:
170
169
  """Fetch portfolio data for Solana.
171
170
 
@@ -152,5 +152,10 @@
152
152
  ]
153
153
  }
154
154
  },
155
- "additionalProperties": true
156
- }
155
+ "additionalProperties": true,
156
+ "x-tags": [
157
+ "Analytics",
158
+ "Crypto",
159
+ "DeFi"
160
+ ]
161
+ }
@@ -0,0 +1,52 @@
1
+ """Morpho AgentKit skills."""
2
+
3
+ from typing import TypedDict
4
+
5
+ from coinbase_agentkit import morpho_action_provider
6
+
7
+ from intentkit.models.agent import Agent
8
+ from intentkit.skills.base import (
9
+ SkillConfig,
10
+ SkillState,
11
+ action_to_structured_tool,
12
+ get_agentkit_actions,
13
+ )
14
+ from intentkit.skills.morpho.base import MorphoBaseTool
15
+
16
+
17
+ class SkillStates(TypedDict):
18
+ MorphoActionProvider_deposit: SkillState
19
+ MorphoActionProvider_withdraw: SkillState
20
+
21
+
22
+ class Config(SkillConfig):
23
+ """Configuration for Morpho skills."""
24
+
25
+ states: SkillStates
26
+
27
+
28
+ async def get_skills(
29
+ config: Config,
30
+ is_private: bool,
31
+ agent_id: str,
32
+ agent: Agent | None = None,
33
+ **_,
34
+ ) -> list[MorphoBaseTool]:
35
+ """Get all Morpho skills."""
36
+
37
+ available_skills: list[str] = []
38
+ for skill_name, state in config["states"].items():
39
+ if state == "disabled":
40
+ continue
41
+ if state == "public" or (state == "private" and is_private):
42
+ available_skills.append(skill_name)
43
+
44
+ actions = await get_agentkit_actions(
45
+ agent_id, [morpho_action_provider], agent=agent
46
+ )
47
+ tools: list[MorphoBaseTool] = []
48
+ for skill in available_skills:
49
+ for action in actions:
50
+ if action.name.endswith(skill):
51
+ tools.append(action_to_structured_tool(action))
52
+ return tools
@@ -0,0 +1,11 @@
1
+ """Morpho AgentKit skills base class."""
2
+
3
+ from intentkit.skills.cdp.base import CDPBaseTool
4
+
5
+
6
+ class MorphoBaseTool(CDPBaseTool):
7
+ """Base class for Morpho tools."""
8
+
9
+ @property
10
+ def category(self) -> str:
11
+ return "morpho"
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
2
+ <defs>
3
+ <radialGradient id="morpho" cx="50%" cy="50%" r="70%">
4
+ <stop offset="0%" stop-color="#82f3ff" />
5
+ <stop offset="100%" stop-color="#006064" />
6
+ </radialGradient>
7
+ </defs>
8
+ <rect width="128" height="128" fill="#004d40" rx="16" />
9
+ <circle cx="64" cy="48" r="28" fill="url(#morpho)" />
10
+ <rect x="36" y="72" width="56" height="20" rx="10" fill="#26a69a" />
11
+ <text x="50%" y="84%" font-family="Arial,Helvetica,sans-serif" font-size="18" fill="#e0f2f1" font-weight="600" text-anchor="middle">Morpho</text>
12
+ </svg>
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "Morpho",
5
+ "description": "Morpho lending actions via Coinbase AgentKit",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/morpho/morpho.svg",
7
+ "x-tags": [
8
+ "DeFi"
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
+ "MorphoActionProvider_deposit": {
21
+ "type": "string",
22
+ "title": "Deposit",
23
+ "enum": [
24
+ "disabled",
25
+ "public",
26
+ "private"
27
+ ],
28
+ "x-enum-title": [
29
+ "Disabled",
30
+ "Agent Owner + All Users",
31
+ "Agent Owner Only"
32
+ ],
33
+ "description": "State for MorphoActionProvider_deposit",
34
+ "default": "disabled"
35
+ },
36
+ "MorphoActionProvider_withdraw": {
37
+ "type": "string",
38
+ "title": "Withdraw",
39
+ "enum": [
40
+ "disabled",
41
+ "public",
42
+ "private"
43
+ ],
44
+ "x-enum-title": [
45
+ "Disabled",
46
+ "Agent Owner + All Users",
47
+ "Agent Owner Only"
48
+ ],
49
+ "description": "State for MorphoActionProvider_withdraw",
50
+ "default": "disabled"
51
+ }
52
+ },
53
+ "description": "States for each Morpho skill (disabled, public, or private)"
54
+ },
55
+ "api_key_provider": {
56
+ "type": "string",
57
+ "title": "API Key Provider",
58
+ "description": "Who provides the API key",
59
+ "enum": [
60
+ "platform"
61
+ ],
62
+ "x-enum-title": [
63
+ "Nation Hosted"
64
+ ],
65
+ "default": "platform"
66
+ }
67
+ },
68
+ "required": [
69
+ "states",
70
+ "enabled"
71
+ ],
72
+ "additionalProperties": true
73
+ }
@@ -1,7 +1,6 @@
1
1
  import logging
2
- from typing import Optional, TypedDict
2
+ from typing import TypedDict
3
3
 
4
- from intentkit.abstracts.skill import SkillStoreABC
5
4
  from intentkit.skills.base import SkillConfig, SkillState
6
5
  from intentkit.skills.nation.base import NationBaseTool
7
6
  from intentkit.skills.nation.nft_check import NftCheck
@@ -25,7 +24,6 @@ class Config(SkillConfig):
25
24
  async def get_skills(
26
25
  config: "Config",
27
26
  is_private: bool,
28
- store: SkillStoreABC,
29
27
  **_,
30
28
  ) -> list[NationBaseTool]:
31
29
  """Get all nation skills."""
@@ -42,20 +40,17 @@ async def get_skills(
42
40
  return [
43
41
  skill
44
42
  for name in available_skills
45
- if (skill := get_nation_skill(name, store)) is not None
43
+ if (skill := get_nation_skill(name)) is not None
46
44
  ]
47
45
 
48
46
 
49
47
  def get_nation_skill(
50
48
  name: str,
51
- store: SkillStoreABC,
52
- ) -> Optional[NationBaseTool]:
49
+ ) -> NationBaseTool | None:
53
50
  """Get a nation skill by name."""
54
51
  if name == "nft_check":
55
52
  if name not in _cache:
56
- _cache[name] = NftCheck(
57
- skill_store=store,
58
- )
53
+ _cache[name] = NftCheck()
59
54
  return _cache[name]
60
55
  else:
61
56
  logger.error(f"Unknown Nation skill: {name}")
@@ -1,8 +1,6 @@
1
- from typing import Type
2
-
3
1
  from pydantic import BaseModel, Field
4
2
 
5
- from intentkit.abstracts.skill import SkillStoreABC
3
+ from intentkit.config.config import config
6
4
  from intentkit.skills.base import IntentKitSkill
7
5
 
8
6
  default_nation_api_url = "http://backend-api"
@@ -13,17 +11,14 @@ class NationBaseTool(IntentKitSkill):
13
11
 
14
12
  name: str = Field(description="The name of the tool")
15
13
  description: str = Field(description="A description of what the tool does")
16
- args_schema: Type[BaseModel]
17
- skill_store: SkillStoreABC = Field(
18
- description="The skill store for persisting data"
19
- )
14
+ args_schema: type[BaseModel]
20
15
 
21
16
  def get_api_key(self) -> str:
22
- return self.skill_store.get_system_config("nation_api_key")
17
+ return config.nation_api_key
23
18
 
24
19
  def get_base_url(self) -> str:
25
- if self.skill_store.get_system_config("nation_api_url"):
26
- return self.skill_store.get_system_config("nation_api_url")
20
+ if config.nation_api_url:
21
+ return config.nation_api_url
27
22
  return default_nation_api_url
28
23
 
29
24
  @property
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  import httpx
5
4
  from eth_utils import is_address
@@ -11,7 +10,7 @@ logger = logging.getLogger(__name__)
11
10
 
12
11
 
13
12
  class NftCheckInput(BaseModel):
14
- nation_wallet_address: Optional[str] = Field(
13
+ nation_wallet_address: str | None = Field(
15
14
  default=None, description="Nation wallet address"
16
15
  )
17
16
 
@@ -19,9 +18,9 @@ class NftCheckInput(BaseModel):
19
18
  class NftCheck(NationBaseTool):
20
19
  name: str = "nft_check"
21
20
  description: str = "Check user nation pass NFTs stats in nation, including usage status and linked agents.By default, it will use the user_id as the wallet address. If you want to check other wallet address, please pass the nation_wallet_address parameter."
22
- args_schema: Type[BaseModel] = NftCheckInput
21
+ args_schema: type[BaseModel] = NftCheckInput
23
22
 
24
- async def _arun(self, nation_wallet_address: Optional[str] = None) -> str:
23
+ async def _arun(self, nation_wallet_address: str | None = None) -> str:
25
24
  """Implementation of the NFT Check tool.
26
25
 
27
26
  Args:
@@ -5,8 +5,9 @@
5
5
  "description": "Check nation NFT stats",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/nation/nation.png",
7
7
  "x-tags": [
8
- "Nation",
9
- "NFTChecker"
8
+ "Analytics",
9
+ "Crypto",
10
+ "NFT"
10
11
  ],
11
12
  "properties": {
12
13
  "enabled": {
@@ -55,4 +56,4 @@
55
56
  "enabled"
56
57
  ],
57
58
  "additionalProperties": true
58
- }
59
+ }
@@ -0,0 +1,30 @@
1
+ from cdp import EvmServerAccount
2
+ from web3 import Web3
3
+
4
+ from intentkit.clients import get_cdp_network as resolve_cdp_network
5
+ from intentkit.clients import get_evm_account as fetch_evm_account
6
+ from intentkit.clients.web3 import get_web3_client
7
+ from intentkit.skills.base import IntentKitSkill
8
+
9
+
10
+ class IntentKitOnChainSkill(IntentKitSkill):
11
+ """Shared helpers for on-chain enabled skills."""
12
+
13
+ def web3_client(self) -> Web3:
14
+ """Get a Web3 client for the active agent network."""
15
+ context = self.get_context()
16
+ agent = context.agent
17
+ network_id = agent.network_id
18
+ return get_web3_client(network_id)
19
+
20
+ async def get_evm_account(self) -> EvmServerAccount:
21
+ """Fetch the EVM account associated with the active agent."""
22
+ context = self.get_context()
23
+ agent = context.agent
24
+ return await fetch_evm_account(agent)
25
+
26
+ def get_cdp_network(self) -> str:
27
+ """Get CDP network mapped from the agent's network id."""
28
+ context = self.get_context()
29
+ agent = context.agent
30
+ return resolve_cdp_network(agent)
@@ -3,11 +3,12 @@
3
3
  import logging
4
4
  from typing import TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.base import SkillConfig, SkillState
8
7
  from intentkit.skills.openai.base import OpenAIBaseTool
9
8
  from intentkit.skills.openai.dalle_image_generation import DALLEImageGeneration
9
+ from intentkit.skills.openai.gpt_avatar_generator import GPTAvatarGenerator
10
10
  from intentkit.skills.openai.gpt_image_generation import GPTImageGeneration
11
+ from intentkit.skills.openai.gpt_image_mini_generator import GPTImageMiniGenerator
11
12
  from intentkit.skills.openai.gpt_image_to_image import GPTImageToImage
12
13
  from intentkit.skills.openai.image_to_text import ImageToText
13
14
 
@@ -21,6 +22,8 @@ class SkillStates(TypedDict):
21
22
  image_to_text: SkillState
22
23
  dalle_image_generation: SkillState
23
24
  gpt_image_generation: SkillState
25
+ gpt_image_mini_generator: SkillState
26
+ gpt_avatar_generator: SkillState
24
27
  gpt_image_to_image: SkillState
25
28
 
26
29
 
@@ -34,7 +37,6 @@ class Config(SkillConfig):
34
37
  async def get_skills(
35
38
  config: "Config",
36
39
  is_private: bool,
37
- store: SkillStoreABC,
38
40
  **_,
39
41
  ) -> list[OpenAIBaseTool]:
40
42
  """Get all OpenAI skills.
@@ -42,7 +44,6 @@ async def get_skills(
42
44
  Args:
43
45
  config: The configuration for OpenAI skills.
44
46
  is_private: Whether to include private skills.
45
- store: The skill store for persisting data.
46
47
 
47
48
  Returns:
48
49
  A list of OpenAI skills.
@@ -59,7 +60,7 @@ async def get_skills(
59
60
  # Get each skill using the cached getter
60
61
  result = []
61
62
  for name in available_skills:
62
- skill = get_openai_skill(name, store)
63
+ skill = get_openai_skill(name)
63
64
  if skill:
64
65
  result.append(skill)
65
66
  return result
@@ -67,40 +68,38 @@ async def get_skills(
67
68
 
68
69
  def get_openai_skill(
69
70
  name: str,
70
- store: SkillStoreABC,
71
71
  ) -> OpenAIBaseTool:
72
72
  """Get an OpenAI skill by name.
73
73
 
74
74
  Args:
75
75
  name: The name of the skill to get
76
- store: The skill store for persisting data
77
76
 
78
77
  Returns:
79
78
  The requested OpenAI skill
80
79
  """
81
80
  if name == "image_to_text":
82
81
  if name not in _cache:
83
- _cache[name] = ImageToText(
84
- skill_store=store,
85
- )
82
+ _cache[name] = ImageToText()
86
83
  return _cache[name]
87
84
  elif name == "dalle_image_generation":
88
85
  if name not in _cache:
89
- _cache[name] = DALLEImageGeneration(
90
- skill_store=store,
91
- )
86
+ _cache[name] = DALLEImageGeneration()
92
87
  return _cache[name]
93
88
  elif name == "gpt_image_generation":
94
89
  if name not in _cache:
95
- _cache[name] = GPTImageGeneration(
96
- skill_store=store,
97
- )
90
+ _cache[name] = GPTImageGeneration()
91
+ return _cache[name]
92
+ elif name == "gpt_image_mini_generator":
93
+ if name not in _cache:
94
+ _cache[name] = GPTImageMiniGenerator()
95
+ return _cache[name]
96
+ elif name == "gpt_avatar_generator":
97
+ if name not in _cache:
98
+ _cache[name] = GPTAvatarGenerator()
98
99
  return _cache[name]
99
100
  elif name == "gpt_image_to_image":
100
101
  if name not in _cache:
101
- _cache[name] = GPTImageToImage(
102
- skill_store=store,
103
- )
102
+ _cache[name] = GPTImageToImage()
104
103
  return _cache[name]
105
104
  else:
106
105
  logger.warning(f"Unknown OpenAI skill: {name}")
@@ -1,11 +1,9 @@
1
1
  """Base class for OpenAI 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,24 +15,22 @@ class OpenAIBaseTool(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("openai_api_key")
25
+ if not config.openai_api_key:
26
+ raise ToolException("OpenAI API key is not configured")
27
+ return config.openai_api_key
31
28
  # for backward compatibility, may only have api_key in skill_config
32
- elif skill_config.get("api_key"):
29
+ if skill_config.get("api_key"):
33
30
  return skill_config.get("api_key")
34
- else:
35
- raise ToolException(
36
- f"Invalid API key provider: {api_key_provider}, or no api_key in config"
37
- )
31
+ raise ToolException(
32
+ f"Invalid API key provider: {api_key_provider}, or no api_key in config"
33
+ )
38
34
 
39
35
  @property
40
36
  def category(self) -> str:
@@ -1,14 +1,13 @@
1
1
  """DALL-E image generation skill for OpenAI."""
2
2
 
3
3
  import logging
4
- from typing import Type
5
4
 
6
5
  import openai
7
6
  from epyxid import XID
8
7
  from pydantic import BaseModel, Field
9
8
 
9
+ from intentkit.clients.s3 import store_image
10
10
  from intentkit.skills.openai.base import OpenAIBaseTool
11
- from intentkit.utils.s3 import store_image
12
11
 
13
12
  logger = logging.getLogger(__name__)
14
13
 
@@ -53,7 +52,7 @@ class DALLEImageGeneration(OpenAIBaseTool):
53
52
  "high-quality images from text descriptions.\n"
54
53
  "You can specify size, quality, and style parameters for more control.\n"
55
54
  )
56
- args_schema: Type[BaseModel] = DALLEImageGenerationInput
55
+ args_schema: type[BaseModel] = DALLEImageGenerationInput
57
56
 
58
57
  async def _arun(
59
58
  self,
@@ -71,7 +70,6 @@ class DALLEImageGeneration(OpenAIBaseTool):
71
70
  quality: Quality of the generated image. Options: standard, hd
72
71
  style: Style of the generated image. Options: vivid, natural
73
72
 
74
-
75
73
  Returns:
76
74
  str: URL of the generated image.
77
75
 
@@ -79,12 +77,9 @@ class DALLEImageGeneration(OpenAIBaseTool):
79
77
  Exception: If the image generation fails.
80
78
  """
81
79
  context = self.get_context()
82
- skill_config = context.agent.skill_config(self.category)
83
80
 
84
- # Get the OpenAI API key from the skill store
85
- api_key = skill_config.get("api_key") or self.skill_store.get_system_config(
86
- "openai_api_key"
87
- )
81
+ # Get the OpenAI API key from configuration or agent settings
82
+ api_key = self.get_api_key()
88
83
 
89
84
  # Generate a unique job ID
90
85
  job_id = str(XID())