intentkit 0.8.6.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 (312) 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 +10 -5
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +3 -2
  8. intentkit/clients/cdp.py +53 -92
  9. intentkit/clients/twitter.py +56 -57
  10. intentkit/clients/web3.py +1 -3
  11. intentkit/config/config.py +5 -0
  12. intentkit/core/agent.py +16 -388
  13. intentkit/core/asset.py +64 -18
  14. intentkit/core/client.py +1 -1
  15. intentkit/core/credit.py +19 -20
  16. intentkit/core/engine.py +26 -11
  17. intentkit/core/node.py +2 -1
  18. intentkit/core/prompt.py +53 -15
  19. intentkit/core/scheduler.py +9 -9
  20. intentkit/core/statistics.py +6 -7
  21. intentkit/models/agent.py +256 -176
  22. intentkit/models/agent_data.py +62 -36
  23. intentkit/models/agent_schema.json +6 -9
  24. intentkit/models/app_setting.py +6 -6
  25. intentkit/models/chat.py +28 -24
  26. intentkit/models/conversation.py +8 -8
  27. intentkit/models/credit.py +62 -64
  28. intentkit/models/db.py +8 -7
  29. intentkit/models/db_mig.py +2 -2
  30. intentkit/models/llm.csv +15 -12
  31. intentkit/models/llm.py +18 -16
  32. intentkit/models/redis.py +2 -3
  33. intentkit/models/skill.py +62 -66
  34. intentkit/models/skills.csv +30 -26
  35. intentkit/models/user.py +46 -21
  36. intentkit/skills/acolyt/__init__.py +2 -9
  37. intentkit/skills/acolyt/ask.py +3 -4
  38. intentkit/skills/acolyt/base.py +4 -9
  39. intentkit/skills/aixbt/__init__.py +2 -13
  40. intentkit/skills/aixbt/base.py +1 -7
  41. intentkit/skills/aixbt/projects.py +14 -15
  42. intentkit/skills/allora/__init__.py +2 -9
  43. intentkit/skills/allora/base.py +4 -9
  44. intentkit/skills/allora/price.py +3 -4
  45. intentkit/skills/base.py +175 -52
  46. intentkit/skills/basename/__init__.py +4 -8
  47. intentkit/skills/carv/__init__.py +115 -121
  48. intentkit/skills/carv/base.py +184 -185
  49. intentkit/skills/carv/fetch_news.py +3 -3
  50. intentkit/skills/carv/onchain_query.py +4 -4
  51. intentkit/skills/carv/token_info_and_price.py +5 -5
  52. intentkit/skills/casino/__init__.py +4 -15
  53. intentkit/skills/casino/base.py +1 -7
  54. intentkit/skills/casino/deck_draw.py +5 -8
  55. intentkit/skills/casino/deck_shuffle.py +6 -6
  56. intentkit/skills/casino/dice_roll.py +2 -4
  57. intentkit/skills/cdp/__init__.py +3 -10
  58. intentkit/skills/cdp/base.py +1 -7
  59. intentkit/skills/cdp/schema.json +1 -17
  60. intentkit/skills/chainlist/__init__.py +2 -7
  61. intentkit/skills/chainlist/base.py +1 -7
  62. intentkit/skills/chainlist/chain_lookup.py +18 -18
  63. intentkit/skills/common/__init__.py +2 -9
  64. intentkit/skills/common/base.py +1 -7
  65. intentkit/skills/common/current_time.py +1 -2
  66. intentkit/skills/cookiefun/__init__.py +6 -9
  67. intentkit/skills/cookiefun/base.py +2 -7
  68. intentkit/skills/cookiefun/get_account_details.py +7 -7
  69. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  70. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  71. intentkit/skills/cookiefun/get_sectors.py +3 -3
  72. intentkit/skills/cookiefun/search_accounts.py +9 -9
  73. intentkit/skills/cryptocompare/__init__.py +7 -24
  74. intentkit/skills/cryptocompare/api.py +2 -3
  75. intentkit/skills/cryptocompare/base.py +10 -24
  76. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  77. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  78. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  79. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  80. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  81. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  82. intentkit/skills/cryptopanic/__init__.py +7 -10
  83. intentkit/skills/cryptopanic/base.py +51 -55
  84. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  85. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  86. intentkit/skills/dapplooker/__init__.py +2 -9
  87. intentkit/skills/dapplooker/base.py +4 -9
  88. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  89. intentkit/skills/defillama/__init__.py +24 -74
  90. intentkit/skills/defillama/api.py +6 -9
  91. intentkit/skills/defillama/base.py +8 -19
  92. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  93. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  94. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  95. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  96. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  97. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  98. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  99. intentkit/skills/defillama/config/chains.py +1 -3
  100. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  101. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  102. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  103. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  104. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  105. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  106. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  107. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  108. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  109. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  110. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  111. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  112. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  113. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  114. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  115. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  116. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  117. intentkit/skills/dexscreener/__init__.py +97 -102
  118. intentkit/skills/dexscreener/base.py +125 -130
  119. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  120. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  121. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  122. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  123. intentkit/skills/dexscreener/search_token.py +182 -184
  124. intentkit/skills/dexscreener/utils.py +15 -14
  125. intentkit/skills/dune_analytics/__init__.py +7 -9
  126. intentkit/skills/dune_analytics/base.py +48 -52
  127. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  128. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  129. intentkit/skills/elfa/__init__.py +5 -18
  130. intentkit/skills/elfa/base.py +10 -14
  131. intentkit/skills/elfa/mention.py +19 -21
  132. intentkit/skills/elfa/stats.py +4 -4
  133. intentkit/skills/elfa/tokens.py +12 -12
  134. intentkit/skills/elfa/utils.py +26 -28
  135. intentkit/skills/enso/__init__.py +11 -31
  136. intentkit/skills/enso/base.py +9 -15
  137. intentkit/skills/enso/best_yield.py +5 -7
  138. intentkit/skills/enso/networks.py +3 -9
  139. intentkit/skills/enso/prices.py +2 -4
  140. intentkit/skills/enso/route.py +6 -12
  141. intentkit/skills/enso/tokens.py +4 -16
  142. intentkit/skills/enso/wallet.py +6 -6
  143. intentkit/skills/erc20/__init__.py +5 -11
  144. intentkit/skills/erc721/__init__.py +5 -9
  145. intentkit/skills/firecrawl/__init__.py +5 -18
  146. intentkit/skills/firecrawl/base.py +4 -9
  147. intentkit/skills/firecrawl/clear.py +4 -8
  148. intentkit/skills/firecrawl/crawl.py +19 -19
  149. intentkit/skills/firecrawl/query.py +4 -3
  150. intentkit/skills/firecrawl/scrape.py +17 -22
  151. intentkit/skills/firecrawl/utils.py +50 -42
  152. intentkit/skills/github/__init__.py +2 -7
  153. intentkit/skills/github/base.py +1 -7
  154. intentkit/skills/github/github_search.py +1 -2
  155. intentkit/skills/heurist/__init__.py +8 -27
  156. intentkit/skills/heurist/base.py +4 -9
  157. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  158. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  159. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  160. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  161. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  162. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  163. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  164. intentkit/skills/http/__init__.py +4 -15
  165. intentkit/skills/http/base.py +1 -7
  166. intentkit/skills/http/get.py +21 -16
  167. intentkit/skills/http/post.py +23 -18
  168. intentkit/skills/http/put.py +23 -18
  169. intentkit/skills/lifi/__init__.py +5 -10
  170. intentkit/skills/lifi/base.py +1 -7
  171. intentkit/skills/lifi/token_execute.py +14 -17
  172. intentkit/skills/lifi/token_quote.py +7 -9
  173. intentkit/skills/lifi/utils.py +16 -16
  174. intentkit/skills/moralis/__init__.py +6 -10
  175. intentkit/skills/moralis/api.py +6 -7
  176. intentkit/skills/moralis/base.py +5 -10
  177. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  178. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  179. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  180. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  181. intentkit/skills/morpho/__init__.py +5 -9
  182. intentkit/skills/nation/__init__.py +4 -9
  183. intentkit/skills/nation/base.py +5 -10
  184. intentkit/skills/nation/nft_check.py +3 -4
  185. intentkit/skills/onchain.py +23 -0
  186. intentkit/skills/openai/__init__.py +17 -18
  187. intentkit/skills/openai/base.py +10 -14
  188. intentkit/skills/openai/dalle_image_generation.py +3 -8
  189. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  190. intentkit/skills/openai/gpt_image_generation.py +4 -8
  191. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  192. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  193. intentkit/skills/openai/image_to_text.py +3 -7
  194. intentkit/skills/openai/schema.json +32 -0
  195. intentkit/skills/portfolio/__init__.py +11 -35
  196. intentkit/skills/portfolio/base.py +33 -19
  197. intentkit/skills/portfolio/token_balances.py +21 -21
  198. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  199. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  200. intentkit/skills/portfolio/wallet_history.py +31 -31
  201. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  202. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  203. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  204. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  205. intentkit/skills/portfolio/wallet_stats.py +3 -3
  206. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  207. intentkit/skills/pyth/__init__.py +4 -10
  208. intentkit/skills/skills.toml +4 -0
  209. intentkit/skills/slack/__init__.py +5 -17
  210. intentkit/skills/slack/base.py +3 -9
  211. intentkit/skills/slack/get_channel.py +8 -8
  212. intentkit/skills/slack/get_message.py +9 -9
  213. intentkit/skills/slack/schedule_message.py +5 -5
  214. intentkit/skills/slack/send_message.py +3 -5
  215. intentkit/skills/supabase/__init__.py +7 -23
  216. intentkit/skills/supabase/base.py +1 -7
  217. intentkit/skills/supabase/delete_data.py +4 -4
  218. intentkit/skills/supabase/fetch_data.py +12 -12
  219. intentkit/skills/supabase/insert_data.py +4 -4
  220. intentkit/skills/supabase/invoke_function.py +6 -6
  221. intentkit/skills/supabase/update_data.py +6 -6
  222. intentkit/skills/supabase/upsert_data.py +4 -4
  223. intentkit/skills/superfluid/__init__.py +5 -9
  224. intentkit/skills/system/__init__.py +7 -24
  225. intentkit/skills/system/add_autonomous_task.py +10 -12
  226. intentkit/skills/system/delete_autonomous_task.py +2 -2
  227. intentkit/skills/system/edit_autonomous_task.py +14 -18
  228. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  229. intentkit/skills/system/read_agent_api_key.py +6 -4
  230. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  231. intentkit/skills/tavily/__init__.py +3 -12
  232. intentkit/skills/tavily/base.py +4 -9
  233. intentkit/skills/tavily/tavily_extract.py +2 -4
  234. intentkit/skills/tavily/tavily_search.py +4 -6
  235. intentkit/skills/token/__init__.py +5 -10
  236. intentkit/skills/token/base.py +7 -11
  237. intentkit/skills/token/erc20_transfers.py +19 -19
  238. intentkit/skills/token/token_analytics.py +3 -3
  239. intentkit/skills/token/token_price.py +13 -13
  240. intentkit/skills/token/token_search.py +9 -9
  241. intentkit/skills/twitter/__init__.py +11 -35
  242. intentkit/skills/twitter/base.py +22 -34
  243. intentkit/skills/twitter/follow_user.py +2 -6
  244. intentkit/skills/twitter/get_mentions.py +5 -12
  245. intentkit/skills/twitter/get_timeline.py +4 -12
  246. intentkit/skills/twitter/get_user_by_username.py +2 -6
  247. intentkit/skills/twitter/get_user_tweets.py +5 -13
  248. intentkit/skills/twitter/like_tweet.py +2 -6
  249. intentkit/skills/twitter/post_tweet.py +6 -9
  250. intentkit/skills/twitter/reply_tweet.py +6 -9
  251. intentkit/skills/twitter/retweet.py +2 -6
  252. intentkit/skills/twitter/search_tweets.py +4 -12
  253. intentkit/skills/unrealspeech/__init__.py +2 -7
  254. intentkit/skills/unrealspeech/base.py +2 -8
  255. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  256. intentkit/skills/venice_audio/__init__.py +98 -106
  257. intentkit/skills/venice_audio/base.py +117 -121
  258. intentkit/skills/venice_audio/input.py +41 -41
  259. intentkit/skills/venice_audio/venice_audio.py +7 -11
  260. intentkit/skills/venice_image/__init__.py +147 -154
  261. intentkit/skills/venice_image/api.py +138 -138
  262. intentkit/skills/venice_image/base.py +185 -192
  263. intentkit/skills/venice_image/config.py +33 -35
  264. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  265. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  266. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  267. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  268. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  269. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  270. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  271. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  272. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  273. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  274. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  275. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  276. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  277. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  278. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  279. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  280. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  281. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  282. intentkit/skills/venice_image/utils.py +77 -78
  283. intentkit/skills/web_scraper/__init__.py +5 -18
  284. intentkit/skills/web_scraper/base.py +21 -7
  285. intentkit/skills/web_scraper/document_indexer.py +7 -6
  286. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  287. intentkit/skills/web_scraper/utils.py +62 -63
  288. intentkit/skills/web_scraper/website_indexer.py +17 -19
  289. intentkit/skills/weth/__init__.py +5 -11
  290. intentkit/skills/wow/__init__.py +5 -11
  291. intentkit/skills/x402/__init__.py +61 -0
  292. intentkit/skills/x402/ask_agent.py +98 -0
  293. intentkit/skills/x402/base.py +99 -0
  294. intentkit/skills/x402/http_request.py +117 -0
  295. intentkit/skills/x402/schema.json +45 -0
  296. intentkit/skills/x402/x402.webp +0 -0
  297. intentkit/skills/xmtp/__init__.py +4 -15
  298. intentkit/skills/xmtp/base.py +5 -5
  299. intentkit/skills/xmtp/price.py +6 -6
  300. intentkit/skills/xmtp/swap.py +6 -8
  301. intentkit/skills/xmtp/transfer.py +4 -6
  302. intentkit/utils/error.py +2 -2
  303. intentkit/utils/logging.py +2 -4
  304. intentkit/utils/s3.py +8 -9
  305. intentkit/utils/schema.py +100 -0
  306. intentkit/utils/slack_alert.py +7 -8
  307. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
  308. intentkit-0.8.17.dist-info/RECORD +466 -0
  309. intentkit/models/generator.py +0 -347
  310. intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
  311. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  312. {intentkit-0.8.6.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 langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
@@ -32,7 +31,7 @@ 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):
38
37
  context = self.get_context()
@@ -40,16 +39,13 @@ class TwitterLikeTweet(TwitterBaseTool):
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,12 +41,12 @@ 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
52
  context = self.get_context()
@@ -54,16 +54,13 @@ class TwitterPostTweet(TwitterBaseTool):
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 = []
69
66
  image_warning = ""
@@ -71,7 +68,7 @@ class TwitterPostTweet(TwitterBaseTool):
71
68
  # Handle image upload if provided
72
69
  if image:
73
70
  # Validate image URL - must be from system's S3 CDN
74
- aws_s3_cdn_url = self.skill_store.get_system_config("aws_s3_cdn_url")
71
+ aws_s3_cdn_url = config.aws_s3_cdn_url
75
72
  if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
76
73
  # Use the TwitterClient method to upload the image
77
74
  media_ids = await twitter.upload_media(context.agent_id, image)
@@ -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,13 +42,13 @@ 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
54
  context = self.get_context()
@@ -56,16 +56,13 @@ class TwitterReplyTweet(TwitterBaseTool):
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 = []
71
68
  image_warning = ""
@@ -73,7 +70,7 @@ class TwitterReplyTweet(TwitterBaseTool):
73
70
  # Handle image upload if provided
74
71
  if image:
75
72
  # Validate image URL - must be from system's S3 CDN
76
- aws_s3_cdn_url = self.skill_store.get_system_config("aws_s3_cdn_url")
73
+ aws_s3_cdn_url = config.aws_s3_cdn_url
77
74
  if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
78
75
  # Use the TwitterClient method to upload the image
79
76
  media_ids = await twitter.upload_media(context.agent_id, image)
@@ -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,7 +31,7 @@ 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):
38
37
  context = self.get_context()
@@ -40,16 +39,13 @@ class TwitterRetweet(TwitterBaseTool):
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
@@ -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,7 +32,7 @@ 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):
39
38
  context = self.get_context()
@@ -42,21 +41,16 @@ class TwitterSearchTweets(TwitterBaseTool):
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()
@@ -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
@@ -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]