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,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from pydantic import BaseModel, Field
5
4
 
@@ -35,24 +34,21 @@ class TwitterGetUserByUsername(TwitterBaseTool):
35
34
 
36
35
  name: str = NAME
37
36
  description: str = PROMPT
38
- args_schema: Type[BaseModel] = TwitterGetUserByUsernameInput
37
+ args_schema: type[BaseModel] = TwitterGetUserByUsernameInput
39
38
 
40
39
  async def _arun(self, username: str, **kwargs):
40
+ context = self.get_context()
41
41
  try:
42
- context = self.get_context()
43
42
  skill_config = context.agent.skill_config(self.category)
44
43
  twitter = get_twitter_client(
45
44
  agent_id=context.agent_id,
46
- skill_store=self.skill_store,
47
45
  config=skill_config,
48
46
  )
49
47
  client = await twitter.get_client()
50
48
 
51
49
  # Check rate limit only when not using OAuth
52
50
  if not twitter.use_key:
53
- await self.check_rate_limit(
54
- context.agent_id, max_requests=5, interval=60 * 24
55
- )
51
+ await self.check_rate_limit(max_requests=5, interval=60 * 24)
56
52
 
57
53
  user_data = await client.get_user(
58
54
  username=username,
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import List, Optional, Type
3
2
 
4
3
  from pydantic import BaseModel, Field
5
4
 
@@ -21,7 +20,7 @@ class TwitterGetUserTweetsInput(BaseModel):
21
20
  """Input for TwitterGetUserTweets tool."""
22
21
 
23
22
  user_id: str = Field(description="The Twitter user ID to fetch tweets from")
24
- exclude: Optional[List[str]] = Field(
23
+ exclude: list[str] | None = Field(
25
24
  default=["replies", "retweets"],
26
25
  description="Types of tweets to exclude (e.g., 'replies', 'retweets')",
27
26
  )
@@ -41,9 +40,10 @@ class TwitterGetUserTweets(TwitterBaseTool):
41
40
 
42
41
  name: str = NAME
43
42
  description: str = PROMPT
44
- args_schema: Type[BaseModel] = TwitterGetUserTweetsInput
43
+ args_schema: type[BaseModel] = TwitterGetUserTweetsInput
45
44
 
46
45
  async def _arun(self, **kwargs):
46
+ context = self.get_context()
47
47
  try:
48
48
  user_id = kwargs.get("user_id")
49
49
  if not user_id:
@@ -55,25 +55,19 @@ class TwitterGetUserTweets(TwitterBaseTool):
55
55
  # Get exclude parameter with default
56
56
  exclude = kwargs.get("exclude", ["replies", "retweets"])
57
57
 
58
- context = self.get_context()
59
58
  skill_config = context.agent.skill_config(self.category)
60
59
  twitter = get_twitter_client(
61
60
  agent_id=context.agent_id,
62
- skill_store=self.skill_store,
63
61
  config=skill_config,
64
62
  )
65
63
  client = await twitter.get_client()
66
64
 
67
65
  # Check rate limit only when not using OAuth
68
66
  if not twitter.use_key:
69
- await self.check_rate_limit(
70
- context.agent_id, max_requests=1, interval=15
71
- )
67
+ await self.check_rate_limit(max_requests=1, interval=15)
72
68
 
73
69
  # get since id from store
74
- last = await self.skill_store.get_agent_skill_data(
75
- context.agent_id, self.name, user_id
76
- )
70
+ last = await self.get_agent_skill_data(user_id)
77
71
  last = last or {}
78
72
  since_id = last.get("since_id")
79
73
 
@@ -112,9 +106,7 @@ class TwitterGetUserTweets(TwitterBaseTool):
112
106
  # Update the since_id in store for the next request
113
107
  if tweets.get("meta") and tweets["meta"].get("newest_id"):
114
108
  last["since_id"] = tweets["meta"]["newest_id"]
115
- await self.skill_store.save_agent_skill_data(
116
- context.agent_id, self.name, user_id, last
117
- )
109
+ await self.save_agent_skill_data(user_id, last)
118
110
 
119
111
  return tweets
120
112
 
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
@@ -32,24 +31,21 @@ class TwitterLikeTweet(TwitterBaseTool):
32
31
 
33
32
  name: str = NAME
34
33
  description: str = PROMPT
35
- args_schema: Type[BaseModel] = TwitterLikeTweetInput
34
+ args_schema: type[BaseModel] = TwitterLikeTweetInput
36
35
 
37
36
  async def _arun(self, tweet_id: str, **kwargs):
37
+ context = self.get_context()
38
38
  try:
39
- context = self.get_context()
40
39
  skill_config = context.agent.skill_config(self.category)
41
40
  twitter = get_twitter_client(
42
41
  agent_id=context.agent_id,
43
- skill_store=self.skill_store,
44
42
  config=skill_config,
45
43
  )
46
44
  client = await twitter.get_client()
47
45
 
48
46
  # Check rate limit only when not using OAuth
49
47
  if not twitter.use_key:
50
- await self.check_rate_limit(
51
- context.agent_id, max_requests=100, interval=1440
52
- )
48
+ await self.check_rate_limit(max_requests=100, interval=1440)
53
49
 
54
50
  # Like the tweet using tweepy client
55
51
  response = await client.like(tweet_id=tweet_id, user_auth=twitter.use_key)
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
6
5
 
7
6
  from intentkit.clients import get_twitter_client
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.twitter.base import TwitterBaseTool
9
9
 
10
10
  NAME = "twitter_post_tweet"
@@ -23,7 +23,7 @@ class TwitterPostTweetInput(BaseModel):
23
23
  description="Tweet text (280 chars for regular users, 25,000 bytes for verified)",
24
24
  max_length=25000,
25
25
  )
26
- image: Optional[str] = Field(
26
+ image: str | None = Field(
27
27
  default=None, description="Optional URL of an image to attach to the tweet"
28
28
  )
29
29
 
@@ -41,36 +41,43 @@ class TwitterPostTweet(TwitterBaseTool):
41
41
 
42
42
  name: str = NAME
43
43
  description: str = PROMPT
44
- args_schema: Type[BaseModel] = TwitterPostTweetInput
44
+ args_schema: type[BaseModel] = TwitterPostTweetInput
45
45
 
46
46
  async def _arun(
47
47
  self,
48
48
  text: str,
49
- image: Optional[str] = None,
49
+ image: str | None = None,
50
50
  **kwargs,
51
51
  ):
52
+ context = self.get_context()
52
53
  try:
53
- context = self.get_context()
54
54
  skill_config = context.agent.skill_config(self.category)
55
55
  twitter = get_twitter_client(
56
56
  agent_id=context.agent_id,
57
- skill_store=self.skill_store,
58
57
  config=skill_config,
59
58
  )
60
59
  client = await twitter.get_client()
61
60
 
62
61
  # Check rate limit only when not using OAuth
63
62
  if not twitter.use_key:
64
- await self.check_rate_limit(
65
- context.agent_id, max_requests=24, interval=1440
66
- )
63
+ await self.check_rate_limit(max_requests=24, interval=1440)
67
64
 
68
65
  media_ids = []
66
+ image_warning = ""
69
67
 
70
68
  # Handle image upload if provided
71
69
  if image:
72
- # Use the TwitterClient method to upload the image
73
- media_ids = await twitter.upload_media(context.agent_id, image)
70
+ # Validate image URL - must be from system's S3 CDN
71
+ aws_s3_cdn_url = config.aws_s3_cdn_url
72
+ if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
73
+ # Use the TwitterClient method to upload the image
74
+ media_ids = await twitter.upload_media(context.agent_id, image)
75
+ else:
76
+ # Image is not from system's S3 CDN, skip upload but warn
77
+ image_warning = "Warning: The provided image URL is not from the system's S3 CDN and has been ignored. "
78
+ logger.warning(
79
+ f"Image URL validation failed for agent {context.agent_id}: {image}"
80
+ )
74
81
 
75
82
  # Post tweet using tweepy client
76
83
  tweet_params = {"text": text, "user_auth": twitter.use_key}
@@ -79,7 +86,11 @@ class TwitterPostTweet(TwitterBaseTool):
79
86
 
80
87
  response = await client.create_tweet(**tweet_params)
81
88
  if "data" in response and "id" in response["data"]:
82
- return response
89
+ # Return response with warning if image was ignored
90
+ result = (
91
+ f"{image_warning}Tweet posted successfully. Response: {response}"
92
+ )
93
+ return result
83
94
  else:
84
95
  logger.error(f"Error posting tweet: {str(response)}")
85
96
  raise ToolException("Failed to post tweet.")
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
6
5
 
7
6
  from intentkit.clients import get_twitter_client
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.twitter.base import TwitterBaseTool
9
9
 
10
10
  NAME = "twitter_reply_tweet"
@@ -24,7 +24,7 @@ class TwitterReplyTweetInput(BaseModel):
24
24
  description="Tweet text (280 chars for regular users, 25,000 bytes for verified)",
25
25
  max_length=25000,
26
26
  )
27
- image: Optional[str] = Field(
27
+ image: str | None = Field(
28
28
  default=None, description="Optional URL of an image to attach to the reply"
29
29
  )
30
30
 
@@ -42,37 +42,44 @@ class TwitterReplyTweet(TwitterBaseTool):
42
42
 
43
43
  name: str = NAME
44
44
  description: str = PROMPT
45
- args_schema: Type[BaseModel] = TwitterReplyTweetInput
45
+ args_schema: type[BaseModel] = TwitterReplyTweetInput
46
46
 
47
47
  async def _arun(
48
48
  self,
49
49
  tweet_id: str,
50
50
  text: str,
51
- image: Optional[str] = None,
51
+ image: str | None = None,
52
52
  **kwargs,
53
53
  ):
54
+ context = self.get_context()
54
55
  try:
55
- context = self.get_context()
56
56
  skill_config = context.agent.skill_config(self.category)
57
57
  twitter = get_twitter_client(
58
58
  agent_id=context.agent_id,
59
- skill_store=self.skill_store,
60
59
  config=skill_config,
61
60
  )
62
61
  client = await twitter.get_client()
63
62
 
64
63
  # Check rate limit only when not using OAuth
65
64
  if not twitter.use_key:
66
- await self.check_rate_limit(
67
- context.agent_id, max_requests=48, interval=1440
68
- )
65
+ await self.check_rate_limit(max_requests=48, interval=1440)
69
66
 
70
67
  media_ids = []
68
+ image_warning = ""
71
69
 
72
70
  # Handle image upload if provided
73
71
  if image:
74
- # Use the TwitterClient method to upload the image
75
- media_ids = await twitter.upload_media(context.agent_id, image)
72
+ # Validate image URL - must be from system's S3 CDN
73
+ aws_s3_cdn_url = config.aws_s3_cdn_url
74
+ if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
75
+ # Use the TwitterClient method to upload the image
76
+ media_ids = await twitter.upload_media(context.agent_id, image)
77
+ else:
78
+ # Image is not from system's S3 CDN, skip upload but warn
79
+ image_warning = "Warning: The provided image URL is not from the system's S3 CDN and has been ignored. "
80
+ logger.warning(
81
+ f"Image URL validation failed for agent {context.agent_id}: {image}"
82
+ )
76
83
 
77
84
  # Post reply tweet using tweepy client
78
85
  tweet_params = {
@@ -87,7 +94,9 @@ class TwitterReplyTweet(TwitterBaseTool):
87
94
  response = await client.create_tweet(**tweet_params)
88
95
 
89
96
  if "data" in response and "id" in response["data"]:
90
- return response
97
+ # Return response with warning if image was ignored
98
+ result = f"{image_warning}Reply tweet posted successfully. Response: {response}"
99
+ return result
91
100
  else:
92
101
  logger.error(f"Error replying to tweet: {str(response)}")
93
102
  raise ToolException("Failed to post reply tweet.")
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
@@ -32,24 +31,21 @@ class TwitterRetweet(TwitterBaseTool):
32
31
 
33
32
  name: str = NAME
34
33
  description: str = PROMPT
35
- args_schema: Type[BaseModel] = TwitterRetweetInput
34
+ args_schema: type[BaseModel] = TwitterRetweetInput
36
35
 
37
36
  async def _arun(self, tweet_id: str, **kwargs):
37
+ context = self.get_context()
38
38
  try:
39
- context = self.get_context()
40
39
  skill_config = context.agent.skill_config(self.category)
41
40
  twitter = get_twitter_client(
42
41
  agent_id=context.agent_id,
43
- skill_store=self.skill_store,
44
42
  config=skill_config,
45
43
  )
46
44
  client = await twitter.get_client()
47
45
 
48
46
  # Check rate limit only when not using OAuth
49
47
  if not twitter.use_key:
50
- await self.check_rate_limit(
51
- context.agent_id, max_requests=5, interval=15
52
- )
48
+ await self.check_rate_limit(max_requests=5, interval=15)
53
49
 
54
50
  # Get authenticated user's ID
55
51
  user_id = twitter.self_id
@@ -5,6 +5,7 @@
5
5
  "description": "Integration with X API enabling social media interactions including retrieving posts, mentions, user information, and posting content with media support",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/twitter/twitter.png",
7
7
  "x-tags": [
8
+ "Communication",
8
9
  "Social"
9
10
  ],
10
11
  "properties": {
@@ -1,6 +1,5 @@
1
1
  import datetime
2
2
  import logging
3
- from typing import Type
4
3
 
5
4
  from pydantic import BaseModel, Field
6
5
 
@@ -33,30 +32,25 @@ class TwitterSearchTweets(TwitterBaseTool):
33
32
 
34
33
  name: str = NAME
35
34
  description: str = PROMPT
36
- args_schema: Type[BaseModel] = TwitterSearchTweetsInput
35
+ args_schema: type[BaseModel] = TwitterSearchTweetsInput
37
36
 
38
37
  async def _arun(self, query: str, **kwargs):
38
+ context = self.get_context()
39
39
  max_results = 10
40
40
  try:
41
- context = self.get_context()
42
41
  skill_config = context.agent.skill_config(self.category)
43
42
  twitter = get_twitter_client(
44
43
  agent_id=context.agent_id,
45
- skill_store=self.skill_store,
46
44
  config=skill_config,
47
45
  )
48
46
  client = await twitter.get_client()
49
47
 
50
48
  # Check rate limit only when not using OAuth
51
49
  if not twitter.use_key:
52
- await self.check_rate_limit(
53
- context.agent_id, max_requests=1, interval=15
54
- )
50
+ await self.check_rate_limit(max_requests=1, interval=15)
55
51
 
56
52
  # Get since_id from store to avoid duplicate results
57
- last = await self.skill_store.get_agent_skill_data(
58
- context.agent_id, self.name, query
59
- )
53
+ last = await self.get_agent_skill_data(query)
60
54
  last = last or {}
61
55
  since_id = last.get("since_id")
62
56
 
@@ -104,9 +98,7 @@ class TwitterSearchTweets(TwitterBaseTool):
104
98
  if tweets.get("meta") and tweets.get("meta").get("newest_id"):
105
99
  last["since_id"] = tweets["meta"]["newest_id"]
106
100
  last["timestamp"] = datetime.datetime.now().isoformat()
107
- await self.skill_store.save_agent_skill_data(
108
- context.agent_id, self.name, query, last
109
- )
101
+ await self.save_agent_skill_data(query, last)
110
102
 
111
103
  return tweets
112
104
 
@@ -1,6 +1,5 @@
1
1
  from typing import TypedDict
2
2
 
3
- from intentkit.abstracts.skill import SkillStoreABC
4
3
  from intentkit.skills.base import SkillConfig, SkillState
5
4
  from intentkit.skills.unrealspeech.base import UnrealSpeechBaseTool
6
5
  from intentkit.skills.unrealspeech.text_to_speech import TextToSpeech
@@ -23,7 +22,6 @@ class Config(SkillConfig):
23
22
  async def get_skills(
24
23
  config: "Config",
25
24
  is_private: bool,
26
- store: SkillStoreABC,
27
25
  **_,
28
26
  ) -> list[UnrealSpeechBaseTool]:
29
27
  """Get all UnrealSpeech tools."""
@@ -37,19 +35,16 @@ async def get_skills(
37
35
  available_skills.append(skill_name)
38
36
 
39
37
  # Get each skill using the cached getter
40
- return [get_unrealspeech_skill(name, store) for name in available_skills]
38
+ return [get_unrealspeech_skill(name) for name in available_skills]
41
39
 
42
40
 
43
41
  def get_unrealspeech_skill(
44
42
  name: str,
45
- store: SkillStoreABC,
46
43
  ) -> UnrealSpeechBaseTool:
47
44
  """Get an UnrealSpeech skill by name."""
48
45
  if name == "text_to_speech":
49
46
  if name not in _cache:
50
- _cache[name] = TextToSpeech(
51
- skill_store=store,
52
- )
47
+ _cache[name] = TextToSpeech()
53
48
  return _cache[name]
54
49
  else:
55
50
  raise ValueError(f"Unknown UnrealSpeech skill: {name}")
@@ -1,9 +1,6 @@
1
- from typing import Type
2
-
3
- from langchain.tools.base import ToolException
1
+ from langchain_core.tools.base import ToolException
4
2
  from pydantic import BaseModel, Field
5
3
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
4
  from intentkit.skills.base import IntentKitSkill
8
5
 
9
6
 
@@ -12,10 +9,7 @@ class UnrealSpeechBaseTool(IntentKitSkill):
12
9
 
13
10
  name: str = Field(description="The name of the tool")
14
11
  description: str = Field(description="A description of what the tool does")
15
- args_schema: Type[BaseModel]
16
- skill_store: SkillStoreABC = Field(
17
- description="The skill store for persisting data"
18
- )
12
+ args_schema: type[BaseModel]
19
13
 
20
14
  def get_api_key(self) -> str:
21
15
  context = self.get_context()
@@ -5,10 +5,7 @@
5
5
  "description": "Convert text to natural-sounding speech with various voices and customization options",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/unrealspeech/unrealspeech.jpg",
7
7
  "x-tags": [
8
- "Audio",
9
- "Speech",
10
- "Text-to-Speech",
11
- "Voice"
8
+ "Audio"
12
9
  ],
13
10
  "properties": {
14
11
  "enabled": {
@@ -97,4 +94,4 @@
97
94
  }
98
95
  },
99
96
  "additionalProperties": true
100
- }
97
+ }
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import os
3
- from typing import Any, Dict, Literal, Optional, Type
3
+ from typing import Any, Literal
4
4
 
5
5
  import httpx
6
6
  from langchain_core.callbacks.manager import CallbackManagerForToolRun
@@ -31,7 +31,7 @@ class TextToSpeechInput(BaseModel):
31
31
  default=0.0,
32
32
  )
33
33
 
34
- timestamp_type: Optional[Literal["word", "sentence"]] = Field(
34
+ timestamp_type: Literal["word", "sentence"] | None = Field(
35
35
  description="The type of timestamps to include in the response. 'word' for word-level timestamps, 'sentence' for sentence-level, or None for no timestamps.",
36
36
  default="word",
37
37
  )
@@ -52,9 +52,9 @@ class TextToSpeech(UnrealSpeechBaseTool):
52
52
  "Returns URLs to the generated audio file and word-level timestamps.\n"
53
53
  "Provides various voice options and speech customization parameters."
54
54
  )
55
- args_schema: Type[BaseModel] = TextToSpeechInput
55
+ args_schema: type[BaseModel] = TextToSpeechInput
56
56
 
57
- def get_env_var(self, env_var_name: str) -> Optional[str]:
57
+ def get_env_var(self, env_var_name: str) -> str | None:
58
58
  """Helper method to get environment variables."""
59
59
  return os.environ.get(env_var_name)
60
60
 
@@ -64,11 +64,11 @@ class TextToSpeech(UnrealSpeechBaseTool):
64
64
  voice_id: str = "af_sarah",
65
65
  bitrate: str = "192k",
66
66
  speed: float = 0.0,
67
- timestamp_type: Optional[Literal["word", "sentence"]] = "word",
68
- config: Optional[Any] = None,
69
- run_manager: Optional[CallbackManagerForToolRun] = None,
67
+ timestamp_type: Literal["word", "sentence"] | None = "word",
68
+ config: Any | None = None,
69
+ run_manager: CallbackManagerForToolRun | None = None,
70
70
  **kwargs,
71
- ) -> Dict[str, Any]:
71
+ ) -> dict[str, Any]:
72
72
  """Run the tool to convert text to speech."""
73
73
 
74
74
  # Get the API key from context config if available