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,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
+ )