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,13 +1,12 @@
1
1
  from decimal import Decimal
2
- from typing import Optional, Type
3
2
 
4
3
  from coinbase_agentkit import CdpEvmWalletProvider
5
- from langchain.tools.base import ToolException
4
+ from langchain_core.tools.base import ToolException
6
5
  from pydantic import BaseModel, Field
7
6
 
8
7
  from intentkit.abstracts.graph import AgentContext
9
- from intentkit.abstracts.skill import SkillStoreABC
10
8
  from intentkit.clients import get_wallet_provider as get_agent_wallet_provider
9
+ from intentkit.config.config import config
11
10
  from intentkit.skills.base import IntentKitSkill
12
11
  from intentkit.utils.chain import ChainProvider, Network, network_to_id
13
12
 
@@ -19,10 +18,7 @@ class EnsoBaseTool(IntentKitSkill):
19
18
 
20
19
  name: str = Field(description="The name of the tool")
21
20
  description: str = Field(description="A description of what the tool does")
22
- args_schema: Type[BaseModel]
23
- skill_store: SkillStoreABC = Field(
24
- description="The skill store for persisting data"
25
- )
21
+ args_schema: type[BaseModel]
26
22
 
27
23
  async def get_wallet_provider(self, context: AgentContext) -> CdpEvmWalletProvider:
28
24
  """Get the wallet provider from the CDP client.
@@ -31,7 +27,7 @@ class EnsoBaseTool(IntentKitSkill):
31
27
  context: The skill context containing agent information.
32
28
 
33
29
  Returns:
34
- Optional[CdpEvmWalletProvider]: The wallet provider if available.
30
+ CdpEvmWalletProvider | None: The wallet provider if available.
35
31
  """
36
32
  return await get_agent_wallet_provider(context.agent)
37
33
 
@@ -39,8 +35,8 @@ class EnsoBaseTool(IntentKitSkill):
39
35
  provider: CdpEvmWalletProvider = await self.get_wallet_provider(context)
40
36
  return provider.get_address()
41
37
 
42
- def get_chain_provider(self, context: AgentContext) -> Optional[ChainProvider]:
43
- return self.skill_store.get_system_config("chain_provider")
38
+ def get_chain_provider(self, context: AgentContext) -> ChainProvider | None:
39
+ return config.chain_provider
44
40
 
45
41
  def get_main_tokens(self, context: AgentContext) -> list[str]:
46
42
  skill_config = context.agent.skill_config(self.category)
@@ -52,7 +48,7 @@ class EnsoBaseTool(IntentKitSkill):
52
48
  skill_config = context.agent.skill_config(self.category)
53
49
  api_key_provider = skill_config.get("api_key_provider")
54
50
  if api_key_provider == "platform":
55
- return self.skill_store.get_system_config("enso_api_token")
51
+ return config.enso_api_token
56
52
  # for backward compatibility, may only have api_token in skill_config
57
53
  elif skill_config.get("api_token"):
58
54
  return skill_config.get("api_token")
@@ -62,7 +58,7 @@ class EnsoBaseTool(IntentKitSkill):
62
58
  )
63
59
 
64
60
  def resolve_chain_id(
65
- self, context: AgentContext, chain_id: Optional[int] = None
61
+ self, context: AgentContext, chain_id: int | None = None
66
62
  ) -> int:
67
63
  if chain_id:
68
64
  return chain_id
@@ -87,9 +83,7 @@ class EnsoBaseTool(IntentKitSkill):
87
83
  return "enso"
88
84
 
89
85
 
90
- def format_amount_with_decimals(
91
- amount: object, decimals: Optional[int]
92
- ) -> Optional[str]:
86
+ def format_amount_with_decimals(amount: object, decimals: int | None) -> str | None:
93
87
  if amount is None or decimals is None:
94
88
  return None
95
89
 
@@ -1,7 +1,5 @@
1
- from typing import List, Optional, Type
2
-
3
1
  import httpx
4
- from langchain.tools.base import ToolException
2
+ from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.enso.base import EnsoBaseTool, base_url
@@ -40,8 +38,8 @@ class YieldOption(BaseModel):
40
38
  None, description="Primary contract address for interacting with the protocol"
41
39
  )
42
40
  apy: float = Field(None, description="Annual Percentage Yield")
43
- tvl: Optional[float] = Field(None, description="Total Value Locked in the protocol")
44
- underlying_tokens: List[str] = Field(
41
+ tvl: float | None = Field(None, description="Total Value Locked in the protocol")
42
+ underlying_tokens: list[str] = Field(
45
43
  [], description="List of underlying token symbols"
46
44
  )
47
45
 
@@ -49,7 +47,7 @@ class YieldOption(BaseModel):
49
47
  class EnsoGetBestYieldOutput(BaseModel):
50
48
  """Output containing the best yield options."""
51
49
 
52
- best_options: List[YieldOption] = Field(
50
+ best_options: list[YieldOption] = Field(
53
51
  [], description="List of best yield options sorted by APY (descending)"
54
52
  )
55
53
  token_symbol: str = Field(None, description="Symbol of the token searched for")
@@ -68,7 +66,7 @@ class EnsoGetBestYield(EnsoBaseTool):
68
66
  "Find the best yield options for a specific token (default: USDC) across all protocols "
69
67
  "on a blockchain network (default: Base). Results are sorted by APY in descending order."
70
68
  )
71
- args_schema: Type[BaseModel] = EnsoGetBestYieldInput
69
+ args_schema: type[BaseModel] = EnsoGetBestYieldInput
72
70
 
73
71
  async def _arun(
74
72
  self,
@@ -1,8 +1,7 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  import httpx
5
- from langchain.tools.base import ToolException
4
+ from langchain_core.tools.base import ToolException
6
5
  from pydantic import BaseModel, Field
7
6
 
8
7
  from .base import EnsoBaseTool, base_url
@@ -46,7 +45,7 @@ class EnsoGetNetworks(EnsoBaseTool):
46
45
 
47
46
  name: str = "enso_get_networks"
48
47
  description: str = "Retrieve networks supported by the Enso API"
49
- args_schema: Type[BaseModel] = EnsoGetNetworksInput
48
+ args_schema: type[BaseModel] = EnsoGetNetworksInput
50
49
 
51
50
  async def _arun(self, **kwargs) -> EnsoGetNetworksOutput:
52
51
  """
@@ -83,12 +82,7 @@ class EnsoGetNetworks(EnsoBaseTool):
83
82
  exclude_none=True
84
83
  )
85
84
 
86
- await self.skill_store.save_agent_skill_data(
87
- context.agent_id,
88
- "enso_get_networks",
89
- "networks",
90
- networks_memory,
91
- )
85
+ await self.save_agent_skill_data("networks", networks_memory)
92
86
 
93
87
  return EnsoGetNetworksOutput(res=networks)
94
88
  except httpx.RequestError as req_err:
@@ -1,7 +1,5 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
- from langchain.tools.base import ToolException
2
+ from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from .base import EnsoBaseTool, base_url
@@ -36,7 +34,7 @@ class EnsoGetPrices(EnsoBaseTool):
36
34
 
37
35
  name: str = "enso_get_prices"
38
36
  description: str = "Retrieve the price of a token by chain ID and contract address"
39
- args_schema: Type[BaseModel] = EnsoGetPricesInput
37
+ args_schema: type[BaseModel] = EnsoGetPricesInput
40
38
 
41
39
  async def _arun(
42
40
  self,
@@ -1,7 +1,5 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
- from langchain.tools.base import ToolException
2
+ from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.enso.networks import EnsoGetNetworks
@@ -155,7 +153,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
155
153
 
156
154
  name: str = "enso_route_shortcut"
157
155
  description: str = "This tool is used specifically for broadcasting a route transaction calldata to the network. It should only be used when the user explicitly requests to broadcast a route transaction with routeId."
158
- args_schema: Type[BaseModel] = EnsoRouteShortcutInput
156
+ args_schema: type[BaseModel] = EnsoRouteShortcutInput
159
157
 
160
158
  async def _arun(
161
159
  self,
@@ -181,7 +179,6 @@ class EnsoRouteShortcut(EnsoBaseTool):
181
179
  """
182
180
 
183
181
  context = self.get_context()
184
- agent_id = context.agent_id
185
182
  resolved_chain_id = self.resolve_chain_id(context, chainId)
186
183
  api_token = self.get_api_token(context)
187
184
  # Use the wallet provider to send the transaction
@@ -191,8 +188,8 @@ class EnsoRouteShortcut(EnsoBaseTool):
191
188
  async with httpx.AsyncClient() as client:
192
189
  try:
193
190
  network_name = None
194
- networks = await self.skill_store.get_agent_skill_data(
195
- agent_id, "enso_get_networks", "networks"
191
+ networks = await self.get_agent_skill_data_raw(
192
+ "enso_get_networks", "networks"
196
193
  )
197
194
 
198
195
  if networks:
@@ -203,9 +200,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
203
200
  else None
204
201
  )
205
202
  if network_name is None:
206
- networks = await EnsoGetNetworks(
207
- skill_store=self.skill_store,
208
- ).arun()
203
+ networks = await EnsoGetNetworks().arun()
209
204
 
210
205
  for network in networks.res:
211
206
  if network.id == resolved_chain_id:
@@ -221,8 +216,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
221
216
  "Authorization": f"Bearer {api_token}",
222
217
  }
223
218
 
224
- token_decimals = await self.skill_store.get_agent_skill_data(
225
- agent_id,
219
+ token_decimals = await self.get_agent_skill_data_raw(
226
220
  "enso_get_tokens",
227
221
  "decimals",
228
222
  )
@@ -1,7 +1,5 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
- from langchain.tools.base import ToolException
2
+ from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.enso.base import EnsoBaseTool, base_url
@@ -133,7 +131,7 @@ class EnsoGetTokens(EnsoBaseTool):
133
131
  "Enso Finance Token Information Tool: Retrieves detailed token information from the Enso Finance API, "
134
132
  "including APY, symbol, address, protocol slug, token type, and underlying tokens."
135
133
  )
136
- args_schema: Type[BaseModel] = EnsoGetTokensInput
134
+ args_schema: type[BaseModel] = EnsoGetTokensInput
137
135
 
138
136
  async def _arun(
139
137
  self,
@@ -154,7 +152,6 @@ class EnsoGetTokens(EnsoBaseTool):
154
152
  url = f"{base_url}/api/v1/tokens"
155
153
 
156
154
  context = self.get_context()
157
- agent_id = context.agent_id
158
155
  resolved_chain_id = self.resolve_chain_id(context, chainId)
159
156
  api_token = self.get_api_token(context)
160
157
  main_tokens = self.get_main_tokens(context)
@@ -178,11 +175,7 @@ class EnsoGetTokens(EnsoBaseTool):
178
175
  response.raise_for_status()
179
176
  json_dict = response.json()
180
177
 
181
- token_decimals = await self.skill_store.get_agent_skill_data(
182
- agent_id,
183
- "enso_get_tokens",
184
- "decimals",
185
- )
178
+ token_decimals = await self.get_agent_skill_data("decimals")
186
179
  if not token_decimals:
187
180
  token_decimals = {}
188
181
 
@@ -203,12 +196,7 @@ class EnsoGetTokens(EnsoBaseTool):
203
196
  if u_token.address:
204
197
  token_decimals[u_token.address] = u_token.decimals
205
198
 
206
- await self.skill_store.save_agent_skill_data(
207
- agent_id,
208
- "enso_get_tokens",
209
- "decimals",
210
- token_decimals,
211
- )
199
+ await self.save_agent_skill_data("decimals", token_decimals)
212
200
 
213
201
  return res
214
202
  except httpx.RequestError as req_err:
@@ -1,7 +1,7 @@
1
- from typing import Literal, Tuple, Type
1
+ from typing import Literal
2
2
 
3
3
  import httpx
4
- from langchain.tools.base import ToolException
4
+ from langchain_core.tools.base import ToolException
5
5
  from pydantic import BaseModel, Field
6
6
 
7
7
  from .base import EnsoBaseTool, base_url
@@ -35,7 +35,7 @@ class EnsoGetWalletBalances(EnsoBaseTool):
35
35
  description: str = (
36
36
  "Retrieve token balances of a wallet on a specified blockchain network."
37
37
  )
38
- args_schema: Type[BaseModel] = EnsoGetBalancesInput
38
+ args_schema: type[BaseModel] = EnsoGetBalancesInput
39
39
 
40
40
  async def _arun(
41
41
  self,
@@ -107,7 +107,7 @@ class EnsoGetWalletApprovals(EnsoBaseTool):
107
107
  description: str = (
108
108
  "Retrieve token spend approvals for a wallet on a specified blockchain network."
109
109
  )
110
- args_schema: Type[BaseModel] = EnsoGetApprovalsInput
110
+ args_schema: type[BaseModel] = EnsoGetApprovalsInput
111
111
 
112
112
  async def _arun(
113
113
  self,
@@ -192,7 +192,7 @@ class EnsoWalletApprove(EnsoBaseTool):
192
192
  "network. It should only be used when the user explicitly requests to broadcast an approval transaction "
193
193
  "with a specific amount for a certain token."
194
194
  )
195
- args_schema: Type[BaseModel] = EnsoWalletApproveInput
195
+ args_schema: type[BaseModel] = EnsoWalletApproveInput
196
196
  response_format: str = "content_and_artifact"
197
197
 
198
198
  async def _arun(
@@ -202,7 +202,7 @@ class EnsoWalletApprove(EnsoBaseTool):
202
202
  chainId: int | None = None,
203
203
  routingStrategy: Literal["ensowallet", "router", "delegate"] | None = None,
204
204
  **_: object,
205
- ) -> Tuple[EnsoWalletApproveOutput, EnsoWalletApproveArtifact]:
205
+ ) -> tuple[EnsoWalletApproveOutput, EnsoWalletApproveArtifact]:
206
206
  context = self.get_context()
207
207
  resolved_chain_id = self.resolve_chain_id(context, chainId)
208
208
  api_token = self.get_api_token(context)
@@ -1,10 +1,10 @@
1
1
  """ERC20 AgentKit skills."""
2
2
 
3
- from typing import TYPE_CHECKING, Optional, TypedDict
3
+ from typing import TypedDict
4
4
 
5
5
  from coinbase_agentkit import erc20_action_provider
6
6
 
7
- from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.models.agent import Agent
8
8
  from intentkit.skills.base import (
9
9
  SkillConfig,
10
10
  SkillState,
@@ -13,9 +13,6 @@ from intentkit.skills.base import (
13
13
  )
14
14
  from intentkit.skills.erc20.base import ERC20BaseTool
15
15
 
16
- if TYPE_CHECKING:
17
- from intentkit.models.agent import Agent
18
-
19
16
 
20
17
  class SkillStates(TypedDict):
21
18
  ERC20ActionProvider_get_balance: SkillState
@@ -29,11 +26,10 @@ class Config(SkillConfig):
29
26
 
30
27
 
31
28
  async def get_skills(
32
- config: "Config",
29
+ config: Config,
33
30
  is_private: bool,
34
- store: SkillStoreABC,
35
31
  agent_id: str,
36
- agent: Optional["Agent"] = None,
32
+ agent: Agent | None = None,
37
33
  **_,
38
34
  ) -> list[ERC20BaseTool]:
39
35
  """Get all ERC20 skills."""
@@ -45,9 +41,7 @@ async def get_skills(
45
41
  if state == "public" or (state == "private" and is_private):
46
42
  available_skills.append(skill_name)
47
43
 
48
- actions = await get_agentkit_actions(
49
- agent_id, store, [erc20_action_provider], agent=agent
50
- )
44
+ actions = await get_agentkit_actions(agent_id, [erc20_action_provider], agent=agent)
51
45
  tools: list[ERC20BaseTool] = []
52
46
  for skill in available_skills:
53
47
  for action in actions:
@@ -1,10 +1,10 @@
1
1
  """ERC721 AgentKit skills."""
2
2
 
3
- from typing import TYPE_CHECKING, Optional, TypedDict
3
+ from typing import TypedDict
4
4
 
5
5
  from coinbase_agentkit import erc721_action_provider
6
6
 
7
- from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.models.agent import Agent
8
8
  from intentkit.skills.base import (
9
9
  SkillConfig,
10
10
  SkillState,
@@ -13,9 +13,6 @@ from intentkit.skills.base import (
13
13
  )
14
14
  from intentkit.skills.erc721.base import ERC721BaseTool
15
15
 
16
- if TYPE_CHECKING:
17
- from intentkit.models.agent import Agent
18
-
19
16
 
20
17
  class SkillStates(TypedDict):
21
18
  Erc721ActionProvider_get_balance: SkillState
@@ -30,11 +27,10 @@ class Config(SkillConfig):
30
27
 
31
28
 
32
29
  async def get_skills(
33
- config: "Config",
30
+ config: Config,
34
31
  is_private: bool,
35
- store: SkillStoreABC,
36
32
  agent_id: str,
37
- agent: Optional["Agent"] = None,
33
+ agent: Agent | None = None,
38
34
  **_,
39
35
  ) -> list[ERC721BaseTool]:
40
36
  """Get all ERC721 skills."""
@@ -47,7 +43,7 @@ async def get_skills(
47
43
  available_skills.append(skill_name)
48
44
 
49
45
  actions = await get_agentkit_actions(
50
- agent_id, store, [erc721_action_provider], agent=agent
46
+ agent_id, [erc721_action_provider], agent=agent
51
47
  )
52
48
  tools: list[ERC721BaseTool] = []
53
49
  for skill in available_skills:
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.base import SkillConfig, SkillState
8
7
  from intentkit.skills.firecrawl.base import FirecrawlBaseTool
9
8
  from intentkit.skills.firecrawl.clear import FirecrawlClearIndexedContent
@@ -37,7 +36,6 @@ class Config(SkillConfig):
37
36
  async def get_skills(
38
37
  config: "Config",
39
38
  is_private: bool,
40
- store: SkillStoreABC,
41
39
  **_,
42
40
  ) -> list[FirecrawlBaseTool]:
43
41
  """Get all Firecrawl skills.
@@ -45,7 +43,6 @@ async def get_skills(
45
43
  Args:
46
44
  config: The configuration for Firecrawl skills.
47
45
  is_private: Whether to include private skills.
48
- store: The skill store for persisting data.
49
46
 
50
47
  Returns:
51
48
  A list of Firecrawl skills.
@@ -60,18 +57,16 @@ async def get_skills(
60
57
  available_skills.append(skill_name)
61
58
 
62
59
  # Get each skill using the cached getter
63
- return [get_firecrawl_skill(name, store) for name in available_skills]
60
+ return [get_firecrawl_skill(name) for name in available_skills]
64
61
 
65
62
 
66
63
  def get_firecrawl_skill(
67
64
  name: str,
68
- store: SkillStoreABC,
69
65
  ) -> FirecrawlBaseTool:
70
66
  """Get a Firecrawl skill by name.
71
67
 
72
68
  Args:
73
69
  name: The name of the skill to get
74
- store: The skill store for persisting data
75
70
 
76
71
  Returns:
77
72
  The requested Firecrawl skill
@@ -81,27 +76,19 @@ def get_firecrawl_skill(
81
76
  """
82
77
  if name == "firecrawl_scrape":
83
78
  if name not in _cache:
84
- _cache[name] = FirecrawlScrape(
85
- skill_store=store,
86
- )
79
+ _cache[name] = FirecrawlScrape()
87
80
  return _cache[name]
88
81
  elif name == "firecrawl_crawl":
89
82
  if name not in _cache:
90
- _cache[name] = FirecrawlCrawl(
91
- skill_store=store,
92
- )
83
+ _cache[name] = FirecrawlCrawl()
93
84
  return _cache[name]
94
85
  elif name == "firecrawl_query_indexed_content":
95
86
  if name not in _cache:
96
- _cache[name] = FirecrawlQueryIndexedContent(
97
- skill_store=store,
98
- )
87
+ _cache[name] = FirecrawlQueryIndexedContent()
99
88
  return _cache[name]
100
89
  elif name == "firecrawl_clear_indexed_content":
101
90
  if name not in _cache:
102
- _cache[name] = FirecrawlClearIndexedContent(
103
- skill_store=store,
104
- )
91
+ _cache[name] = FirecrawlClearIndexedContent()
105
92
  return _cache[name]
106
93
  else:
107
94
  raise ValueError(f"Unknown Firecrawl skill: {name}")
@@ -1,9 +1,7 @@
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
4
+ from intentkit.config.config import config
7
5
  from intentkit.skills.base import IntentKitSkill
8
6
 
9
7
 
@@ -12,10 +10,7 @@ class FirecrawlBaseTool(IntentKitSkill):
12
10
 
13
11
  name: str = Field(description="The name of the tool")
14
12
  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
- )
13
+ args_schema: type[BaseModel]
19
14
 
20
15
  def get_api_key(self) -> str:
21
16
  """Get the Firecrawl API key from configuration."""
@@ -29,7 +24,7 @@ class FirecrawlBaseTool(IntentKitSkill):
29
24
  else:
30
25
  raise ToolException("No api_key found in agent_owner configuration")
31
26
  else:
32
- return self.skill_store.get_system_config("firecrawl_api_key")
27
+ return config.firecrawl_api_key
33
28
 
34
29
  @property
35
30
  def category(self) -> str:
@@ -1,8 +1,8 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from pydantic import BaseModel, Field
5
4
 
5
+ from intentkit.models.skill import AgentSkillData
6
6
  from intentkit.skills.firecrawl.base import FirecrawlBaseTool
7
7
 
8
8
  logger = logging.getLogger(__name__)
@@ -30,7 +30,7 @@ class FirecrawlClearIndexedContent(FirecrawlBaseTool):
30
30
  "This will permanently delete all indexed content and cannot be undone.\n"
31
31
  "Use this tool when you want to start fresh with new content."
32
32
  )
33
- args_schema: Type[BaseModel] = FirecrawlClearInput
33
+ args_schema: type[BaseModel] = FirecrawlClearInput
34
34
 
35
35
  async def _arun(
36
36
  self,
@@ -62,15 +62,11 @@ class FirecrawlClearIndexedContent(FirecrawlBaseTool):
62
62
  try:
63
63
  # Delete vector store data (using web_scraper storage format for compatibility)
64
64
  vector_store_key = f"vector_store_{agent_id}"
65
- await self.skill_store.delete_agent_skill_data(
66
- agent_id, "web_scraper", vector_store_key
67
- )
65
+ await AgentSkillData.delete(agent_id, "web_scraper", vector_store_key)
68
66
 
69
67
  # Delete metadata
70
68
  metadata_key = f"indexed_urls_{agent_id}"
71
- await self.skill_store.delete_agent_skill_data(
72
- agent_id, "web_scraper", metadata_key
73
- )
69
+ await AgentSkillData.delete(agent_id, "web_scraper", metadata_key)
74
70
 
75
71
  logger.info(
76
72
  f"firecrawl_clear: Successfully cleared all indexed content for agent {agent_id}"
@@ -1,6 +1,5 @@
1
1
  import asyncio
2
2
  import logging
3
- from typing import List, Optional, Type
4
3
 
5
4
  import httpx
6
5
  from langchain_core.documents import Document
@@ -20,19 +19,19 @@ class FirecrawlCrawlInput(BaseModel):
20
19
  limit: int = Field(
21
20
  description="Maximum number of pages to crawl", default=10, ge=1, le=1000
22
21
  )
23
- formats: List[str] = Field(
22
+ formats: list[str] = Field(
24
23
  description="Output formats to include in the response. Options: 'markdown', 'html', 'rawHtml', 'screenshot', 'links', 'json'",
25
24
  default=["markdown"],
26
25
  )
27
- include_paths: Optional[List[str]] = Field(
26
+ include_paths: list[str] | None = Field(
28
27
  description="Regex patterns to include in the crawl (e.g., ['^/blog/.*$'])",
29
28
  default=None,
30
29
  )
31
- exclude_paths: Optional[List[str]] = Field(
30
+ exclude_paths: list[str] | None = Field(
32
31
  description="Regex patterns to exclude from the crawl (e.g., ['^/admin/.*$'])",
33
32
  default=None,
34
33
  )
35
- max_depth: Optional[int] = Field(
34
+ max_depth: int | None = Field(
36
35
  description="Maximum depth to crawl from the base URL",
37
36
  default=None,
38
37
  ge=1,
@@ -91,16 +90,16 @@ class FirecrawlCrawl(FirecrawlBaseTool):
91
90
  "Optionally indexes all crawled content for later querying using the firecrawl_query_indexed_content tool. "
92
91
  "Use this when you need to gather comprehensive information from a website."
93
92
  )
94
- args_schema: Type[BaseModel] = FirecrawlCrawlInput
93
+ args_schema: type[BaseModel] = FirecrawlCrawlInput
95
94
 
96
95
  async def _arun(
97
96
  self,
98
97
  url: str,
99
98
  limit: int = 10,
100
- formats: List[str] = None,
101
- include_paths: Optional[List[str]] = None,
102
- exclude_paths: Optional[List[str]] = None,
103
- max_depth: Optional[int] = None,
99
+ formats: list[str] = None,
100
+ include_paths: list[str] | None = None,
101
+ exclude_paths: list[str] | None = None,
102
+ max_depth: int | None = None,
104
103
  allow_backward_links: bool = False,
105
104
  allow_external_links: bool = False,
106
105
  allow_subdomains: bool = False,
@@ -137,9 +136,8 @@ class FirecrawlCrawl(FirecrawlBaseTool):
137
136
  "rate_limit_minutes"
138
137
  ):
139
138
  await self.user_rate_limit_by_category(
140
- context.user_id,
141
139
  skill_config["rate_limit_number"],
142
- skill_config["rate_limit_minutes"],
140
+ skill_config["rate_limit_minutes"] * 60,
143
141
  )
144
142
 
145
143
  # Get the API key from the agent's configuration
@@ -279,6 +277,7 @@ class FirecrawlCrawl(FirecrawlBaseTool):
279
277
  # Import indexing utilities from firecrawl utils
280
278
  from intentkit.skills.firecrawl.utils import (
281
279
  FirecrawlMetadataManager,
280
+ FirecrawlVectorStoreManager,
282
281
  index_documents,
283
282
  )
284
283
 
@@ -309,24 +308,25 @@ class FirecrawlCrawl(FirecrawlBaseTool):
309
308
  # Get agent ID for indexing
310
309
  agent_id = context.agent_id
311
310
  if agent_id and documents:
311
+ vector_manager = FirecrawlVectorStoreManager()
312
+
312
313
  # Index all documents
313
314
  total_chunks, was_merged = await index_documents(
314
315
  documents,
315
316
  agent_id,
316
- self.skill_store,
317
+ vector_manager,
317
318
  chunk_size,
318
319
  chunk_overlap,
319
320
  )
320
321
 
321
322
  # Update metadata
322
- metadata_manager = FirecrawlMetadataManager(
323
- self.skill_store
324
- )
325
323
  urls = [doc.metadata["source"] for doc in documents]
326
- new_metadata = metadata_manager.create_url_metadata(
327
- urls, documents, "firecrawl_crawl"
324
+ new_metadata = (
325
+ FirecrawlMetadataManager.create_url_metadata(
326
+ urls, documents, "firecrawl_crawl"
327
+ )
328
328
  )
329
- await metadata_manager.update_metadata(
329
+ await FirecrawlMetadataManager.update_metadata(
330
330
  agent_id, new_metadata
331
331
  )
332
332