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,106 +1,98 @@
1
- import logging
2
- from typing import List, Literal, Optional, TypedDict
3
-
4
- from intentkit.abstracts.skill import SkillStoreABC
5
- from intentkit.skills.base import SkillConfig, SkillState
6
- from intentkit.skills.venice_audio.base import VeniceAudioBaseTool
7
- from intentkit.skills.venice_audio.venice_audio import VeniceAudioTool
8
-
9
- logger = logging.getLogger(__name__)
10
-
11
-
12
- _cache: dict[str, VeniceAudioBaseTool] = {}
13
-
14
- _SKILL_NAME_TO_CLASS_MAP = {
15
- "text_to_speech": VeniceAudioTool,
16
- # Add new mappings here: "skill_name": SkillClassName
17
- }
18
-
19
-
20
- class SkillStates(TypedDict):
21
- text_to_speech: SkillState
22
-
23
-
24
- class Config(SkillConfig):
25
- enabled: bool
26
- voice_model: Literal["af_heart", "bm_lewis", "custom"]
27
- states: SkillStates # type: ignore
28
- api_key_provider: Optional[Literal["agent_owner"]]
29
-
30
- # conditionally required
31
- api_key: Optional[str]
32
- voice_model_custom: Optional[list[str]]
33
-
34
- # optional
35
- rate_limit_number: Optional[int]
36
- rate_limit_minutes: Optional[int]
37
-
38
-
39
- async def get_skills(
40
- config: "Config",
41
- is_private: bool,
42
- store: SkillStoreABC,
43
- **_, # Allow for extra arguments if the loader passes them
44
- ) -> list[VeniceAudioBaseTool]:
45
- """
46
- Factory function to create and return Venice Audio skill tools.
47
-
48
- Args:
49
- config: The configuration dictionary for the Venice Audio skill.
50
- skill_store: The skill store instance.
51
- agent_id: The ID of the agent requesting the skills.
52
-
53
- Returns:
54
- A list of VeniceAudioBaseTool instances for the Venice Audio skill.
55
- """
56
- # Check if the entire category is disabled first
57
- if not config.get("enabled", False):
58
- return []
59
-
60
- available_skills: List[VeniceAudioBaseTool] = []
61
- skill_states = config.get("states", {})
62
-
63
- # Iterate through all known skills defined in the map
64
- for skill_name in _SKILL_NAME_TO_CLASS_MAP:
65
- state = skill_states.get(
66
- skill_name, "disabled"
67
- ) # Default to disabled if not in config
68
-
69
- if state == "disabled":
70
- continue
71
- elif state == "public" or (state == "private" and is_private):
72
- # If enabled, get the skill instance using the factory function
73
- skill_instance = get_venice_audio_skill(skill_name, store)
74
- if skill_instance:
75
- available_skills.append(skill_instance)
76
- else:
77
- # This case should ideally not happen if the map is correct
78
- logger.warning(f"Could not instantiate known skill: {skill_name}")
79
-
80
- return available_skills
81
-
82
-
83
- def get_venice_audio_skill(
84
- name: str,
85
- store: SkillStoreABC,
86
- ) -> Optional[VeniceAudioBaseTool]:
87
- """
88
- Factory function to get a cached Venice Audio skill instance by name.
89
-
90
- Args:
91
- name: The name of voice model.
92
- store: The skill store, passed to the skill constructor.
93
-
94
- Returns:
95
- The requested Venice Audio skill instance, or None if the name is unknown.
96
- """
97
-
98
- # Return from cache immediately if already exists
99
- if name in _cache:
100
- return _cache[name]
101
-
102
- # Cache and return the newly created instance
103
- _cache[name] = VeniceAudioTool(
104
- skill_store=store,
105
- )
106
- return _cache[name]
1
+ import logging
2
+ from typing import Literal, TypedDict
3
+
4
+ from intentkit.skills.base import SkillConfig, SkillState
5
+ from intentkit.skills.venice_audio.base import VeniceAudioBaseTool
6
+ from intentkit.skills.venice_audio.venice_audio import VeniceAudioTool
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+ _cache: dict[str, VeniceAudioBaseTool] = {}
11
+
12
+ _SKILL_NAME_TO_CLASS_MAP = {
13
+ "text_to_speech": VeniceAudioTool,
14
+ # Add new mappings here: "skill_name": SkillClassName
15
+ }
16
+
17
+
18
+ class SkillStates(TypedDict):
19
+ text_to_speech: SkillState
20
+
21
+
22
+ class Config(SkillConfig):
23
+ enabled: bool
24
+ voice_model: Literal["af_heart", "bm_lewis", "custom"]
25
+ states: SkillStates # type: ignore
26
+ api_key_provider: Literal["agent_owner"] | None
27
+
28
+ # conditionally required
29
+ api_key: str | None
30
+ voice_model_custom: list[str] | None
31
+
32
+ # optional
33
+ rate_limit_number: int | None
34
+ rate_limit_minutes: int | None
35
+
36
+
37
+ async def get_skills(
38
+ config: "Config",
39
+ is_private: bool,
40
+ **_, # Allow for extra arguments if the loader passes them
41
+ ) -> list[VeniceAudioBaseTool]:
42
+ """
43
+ Factory function to create and return Venice Audio skill tools.
44
+
45
+ Args:
46
+ config: The configuration dictionary for the Venice Audio skill.
47
+ agent_id: The ID of the agent requesting the skills.
48
+
49
+ Returns:
50
+ A list of VeniceAudioBaseTool instances for the Venice Audio skill.
51
+ """
52
+ # Check if the entire category is disabled first
53
+ if not config.get("enabled", False):
54
+ return []
55
+
56
+ available_skills: list[VeniceAudioBaseTool] = []
57
+ skill_states = config.get("states", {})
58
+
59
+ # Iterate through all known skills defined in the map
60
+ for skill_name in _SKILL_NAME_TO_CLASS_MAP:
61
+ state = skill_states.get(
62
+ skill_name, "disabled"
63
+ ) # Default to disabled if not in config
64
+
65
+ if state == "disabled":
66
+ continue
67
+ elif state == "public" or (state == "private" and is_private):
68
+ # If enabled, get the skill instance using the factory function
69
+ skill_instance = get_venice_audio_skill(skill_name)
70
+ if skill_instance:
71
+ available_skills.append(skill_instance)
72
+ else:
73
+ # This case should ideally not happen if the map is correct
74
+ logger.warning(f"Could not instantiate known skill: {skill_name}")
75
+
76
+ return available_skills
77
+
78
+
79
+ def get_venice_audio_skill(
80
+ name: str,
81
+ ) -> VeniceAudioBaseTool | None:
82
+ """
83
+ Factory function to get a cached Venice Audio skill instance by name.
84
+
85
+ Args:
86
+ name: The name of voice model.
87
+
88
+ Returns:
89
+ The requested Venice Audio skill instance, or None if the name is unknown.
90
+ """
91
+
92
+ # Return from cache immediately if already exists
93
+ if name in _cache:
94
+ return _cache[name]
95
+
96
+ # Cache and return the newly created instance
97
+ _cache[name] = VeniceAudioTool()
98
+ return _cache[name]
@@ -1,121 +1,117 @@
1
- import logging
2
- from typing import Dict, List, Optional, Tuple, Type
3
-
4
- from langchain.tools.base import ToolException
5
- from pydantic import BaseModel, Field
6
-
7
- from intentkit.abstracts.skill import SkillStoreABC
8
- from intentkit.skills.base import IntentKitSkill
9
-
10
- logger = logging.getLogger(__name__)
11
-
12
-
13
- class VeniceAudioBaseTool(IntentKitSkill):
14
- """Base class for Venice Audio tools."""
15
-
16
- name: str = Field(default="venice_base_tool", description="The name of the tool")
17
- description: str = Field(description="A description of what the tool does")
18
- args_schema: Type[BaseModel] # type: ignore
19
- skill_store: SkillStoreABC = Field(
20
- description="The skill store for persisting data"
21
- )
22
-
23
- @property
24
- def category(self) -> str:
25
- return "venice_audio"
26
-
27
- def validate_voice_model(
28
- self, context, voice_model: str
29
- ) -> Tuple[bool, Optional[Dict[str, object]]]:
30
- config = context.config
31
-
32
- selected_model = config.get("voice_model")
33
- custom_models = config.get("voice_model_custom", [])
34
-
35
- allowed_voice_models: List[str] = []
36
-
37
- if selected_model == "custom":
38
- allowed_voice_models = custom_models or []
39
- else:
40
- allowed_voice_models = [selected_model] if selected_model else []
41
-
42
- if voice_model not in allowed_voice_models:
43
- return False, {
44
- "error": f'"{voice_model}" is not allowed',
45
- "allowed": allowed_voice_models,
46
- "suggestion": "please try again with allowed voice model",
47
- }
48
-
49
- return True, None
50
-
51
- def get_api_key(self) -> str:
52
- """
53
- Retrieves the Venice AI API key based on the api_key_provider setting.
54
-
55
- Returns:
56
- The API key if found.
57
-
58
- Raises:
59
- ToolException: If the API key is not found or provider is invalid.
60
- """
61
- try:
62
- context = self.get_context()
63
- skill_config = context.agent.skill_config(self.category)
64
- api_key_provider = skill_config.get("api_key_provider")
65
- if api_key_provider == "agent_owner":
66
- agent_api_key = skill_config.get("api_key")
67
- if agent_api_key:
68
- logger.debug(
69
- f"Using agent-specific Venice API key for skill {self.name} in category {self.category}"
70
- )
71
- return agent_api_key
72
- raise ToolException(
73
- f"No agent-owned Venice API key found for skill '{self.name}' in category '{self.category}'."
74
- )
75
-
76
- elif api_key_provider == "platform":
77
- system_api_key = self.skill_store.get_system_config("venice_api_key")
78
- if system_api_key:
79
- logger.debug(
80
- f"Using system Venice API key for skill {self.name} in category {self.category}"
81
- )
82
- return system_api_key
83
- raise ToolException(
84
- f"No platform-hosted Venice API key found for skill '{self.name}' in category '{self.category}'."
85
- )
86
-
87
- else:
88
- raise ToolException(
89
- f"Invalid API key provider '{api_key_provider}' for skill '{self.name}'"
90
- )
91
-
92
- except Exception as e:
93
- raise ToolException(f"Failed to retrieve Venice API key: {str(e)}") from e
94
-
95
- async def apply_rate_limit(self, context) -> None:
96
- """
97
- Applies rate limiting ONLY if specified in the agent's config ('skill_config').
98
- Checks for 'rate_limit_number' and 'rate_limit_minutes'.
99
- If not configured, NO rate limiting is applied.
100
- Raises ConnectionAbortedError if the configured limit is exceeded.
101
- """
102
- skill_config = context.agent.skill_config(self.category)
103
- user_id = context.agent.id
104
-
105
- # Get agent-specific limits safely
106
- limit_num = skill_config.get("rate_limit_number")
107
- limit_min = skill_config.get("rate_limit_minutes")
108
-
109
- # Apply limit ONLY if both values are present and valid (truthy check handles None and 0)
110
- if limit_num and limit_min:
111
- limit_source = "Agent"
112
- logger.debug(
113
- f"Applying {limit_source} rate limit ({limit_num}/{limit_min} min) for user {user_id} on {self.name}"
114
- )
115
- if user_id:
116
- await self.user_rate_limit_by_category(user_id, limit_num, limit_min)
117
- else:
118
- # No valid agent configuration found, so do nothing.
119
- logger.debug(
120
- f"No agent rate limits configured for category '{self.category}'. Skipping rate limit for user {user_id}."
121
- )
1
+ import logging
2
+
3
+ from langchain_core.tools.base import ToolException
4
+ from pydantic import BaseModel, Field
5
+
6
+ from intentkit.config.config import config
7
+ from intentkit.skills.base import IntentKitSkill
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class VeniceAudioBaseTool(IntentKitSkill):
13
+ """Base class for Venice Audio tools."""
14
+
15
+ name: str = Field(default="venice_base_tool", description="The name of the tool")
16
+ description: str = Field(description="A description of what the tool does")
17
+ args_schema: type[BaseModel] # type: ignore
18
+
19
+ @property
20
+ def category(self) -> str:
21
+ return "venice_audio"
22
+
23
+ def validate_voice_model(
24
+ self, context, voice_model: str
25
+ ) -> tuple[bool, dict[str, object] | None]:
26
+ config = context.config
27
+
28
+ selected_model = config.get("voice_model")
29
+ custom_models = config.get("voice_model_custom", [])
30
+
31
+ allowed_voice_models: list[str] = []
32
+
33
+ if selected_model == "custom":
34
+ allowed_voice_models = custom_models or []
35
+ else:
36
+ allowed_voice_models = [selected_model] if selected_model else []
37
+
38
+ if voice_model not in allowed_voice_models:
39
+ return False, {
40
+ "error": f'"{voice_model}" is not allowed',
41
+ "allowed": allowed_voice_models,
42
+ "suggestion": "please try again with allowed voice model",
43
+ }
44
+
45
+ return True, None
46
+
47
+ def get_api_key(self) -> str:
48
+ """
49
+ Retrieves the Venice AI API key based on the api_key_provider setting.
50
+
51
+ Returns:
52
+ The API key if found.
53
+
54
+ Raises:
55
+ ToolException: If the API key is not found or provider is invalid.
56
+ """
57
+ try:
58
+ context = self.get_context()
59
+ skill_config = context.agent.skill_config(self.category)
60
+ api_key_provider = skill_config.get("api_key_provider")
61
+ if api_key_provider == "agent_owner":
62
+ agent_api_key = skill_config.get("api_key")
63
+ if agent_api_key:
64
+ logger.debug(
65
+ f"Using agent-specific Venice API key for skill {self.name} in category {self.category}"
66
+ )
67
+ return agent_api_key
68
+ raise ToolException(
69
+ f"No agent-owned Venice API key found for skill '{self.name}' in category '{self.category}'."
70
+ )
71
+
72
+ elif api_key_provider == "platform":
73
+ system_api_key = config.venice_api_key
74
+ if system_api_key:
75
+ logger.debug(
76
+ f"Using system Venice API key for skill {self.name} in category {self.category}"
77
+ )
78
+ return system_api_key
79
+ raise ToolException(
80
+ f"No platform-hosted Venice API key found for skill '{self.name}' in category '{self.category}'."
81
+ )
82
+
83
+ else:
84
+ raise ToolException(
85
+ f"Invalid API key provider '{api_key_provider}' for skill '{self.name}'"
86
+ )
87
+
88
+ except Exception as e:
89
+ raise ToolException(f"Failed to retrieve Venice API key: {str(e)}") from e
90
+
91
+ async def apply_rate_limit(self, context) -> None:
92
+ """
93
+ Applies rate limiting ONLY if specified in the agent's config ('skill_config').
94
+ Checks for 'rate_limit_number' and 'rate_limit_minutes'.
95
+ If not configured, NO rate limiting is applied.
96
+ Raises ConnectionAbortedError if the configured limit is exceeded.
97
+ """
98
+ skill_config = context.agent.skill_config(self.category)
99
+ user_id = context.agent.id
100
+
101
+ # Get agent-specific limits safely
102
+ limit_num = skill_config.get("rate_limit_number")
103
+ limit_min = skill_config.get("rate_limit_minutes")
104
+
105
+ # Apply limit ONLY if both values are present and valid (truthy check handles None and 0)
106
+ if limit_num and limit_min:
107
+ limit_source = "Agent"
108
+ logger.debug(
109
+ f"Applying {limit_source} rate limit ({limit_num}/{limit_min} min) for user {user_id} on {self.name}"
110
+ )
111
+ if user_id:
112
+ await self.user_rate_limit_by_category(limit_num, limit_min * 60)
113
+ else:
114
+ # No valid agent configuration found, so do nothing.
115
+ logger.debug(
116
+ f"No agent rate limits configured for category '{self.category}'. Skipping rate limit for user {user_id}."
117
+ )
@@ -1,41 +1,41 @@
1
- from typing import Literal, Optional
2
-
3
- from pydantic import BaseModel, Field
4
-
5
- # Define the allowed format literals based on the API documentation
6
- AllowedAudioFormat = Literal["mp3", "opus", "aac", "flac", "wav", "pcm"]
7
-
8
-
9
- class VeniceAudioInput(BaseModel):
10
- """
11
- Input schema for Venice AI Text-to-Speech (/audio/speech endpoint).
12
- Defines parameters controllable by the user when invoking the tool.
13
- """
14
-
15
- input: str = Field(
16
- ..., # Ellipsis (...) indicates this field is required
17
- description="The text to generate audio for. Maximum length is 4096 characters.",
18
- min_length=1, # As per API docs: Required string length: 1
19
- max_length=4096, # As per API docs: The maximum length is 4096 characters.
20
- )
21
-
22
- voice_model: str = Field(
23
- description="voice model to used to generate voice from text_to_speech tool."
24
- )
25
-
26
- speed: Optional[float] = Field(
27
- default=1.0, # As per API docs: default: 1 (using float for consistency)
28
- description="The speed of the generated audio. 1.0 is normal speed. Allowed range: 0.25 to 4.0.",
29
- ge=0.25, # As per API docs: Required range: 0.25 <= x
30
- le=4.0, # As per API docs: Required range: x <= 4
31
- )
32
-
33
- response_format: Optional[AllowedAudioFormat] = Field(
34
- default="mp3", # As per API docs: default: mp3
35
- description="The desired audio format for the output file.",
36
- )
37
-
38
- # --- Note on other API parameters ---
39
- # 'model': Currently hardcoded to 'tts-kokoro' in VeniceAudioBaseTool._arun. Could be added here if needed.
40
- # 'voice': Handled by the 'voice_model' attribute of the specific VeniceAudioBaseTool instance. Not typically set via input schema.
41
- # 'streaming': Currently hardcoded to False in VeniceAudioBaseTool._arun. Could be added here if streaming support is implemented.
1
+ from typing import Literal
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ # Define the allowed format literals based on the API documentation
6
+ AllowedAudioFormat = Literal["mp3", "opus", "aac", "flac", "wav", "pcm"]
7
+
8
+
9
+ class VeniceAudioInput(BaseModel):
10
+ """
11
+ Input schema for Venice AI Text-to-Speech (/audio/speech endpoint).
12
+ Defines parameters controllable by the user when invoking the tool.
13
+ """
14
+
15
+ voice_input: str = Field(
16
+ ..., # Ellipsis (...) indicates this field is required
17
+ description="The text to generate audio for. Maximum length is 4096 characters.",
18
+ min_length=1, # As per API docs: Required string length: 1
19
+ max_length=4096, # As per API docs: The maximum length is 4096 characters.
20
+ )
21
+
22
+ voice_model: str = Field(
23
+ description="voice model to used to generate voice from text_to_speech tool."
24
+ )
25
+
26
+ speed: float | None = Field(
27
+ default=1.0, # As per API docs: default: 1 (using float for consistency)
28
+ description="The speed of the generated audio. 1.0 is normal speed. Allowed range: 0.25 to 4.0.",
29
+ ge=0.25, # As per API docs: Required range: 0.25 <= x
30
+ le=4.0, # As per API docs: Required range: x <= 4
31
+ )
32
+
33
+ response_format: AllowedAudioFormat | None = Field(
34
+ default="mp3", # As per API docs: default: mp3
35
+ description="The desired audio format for the output file.",
36
+ )
37
+
38
+ # --- Note on other API parameters ---
39
+ # 'model': Currently hardcoded to 'tts-kokoro' in VeniceAudioBaseTool._arun. Could be added here if needed.
40
+ # 'voice': Handled by the 'voice_model' attribute of the specific VeniceAudioBaseTool instance. Not typically set via input schema.
41
+ # 'streaming': Currently hardcoded to False in VeniceAudioBaseTool._arun. Could be added here if streaming support is implemented.