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
@@ -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.defillama.base import DefiLlamaBaseTool
9
8
  from intentkit.skills.defillama.coins.fetch_batch_historical_prices import (
@@ -124,7 +123,6 @@ class Config(SkillConfig):
124
123
  async def get_skills(
125
124
  config: "Config",
126
125
  is_private: bool,
127
- store: SkillStoreABC,
128
126
  **_,
129
127
  ) -> list[DefiLlamaBaseTool]:
130
128
  """Get all DeFi Llama skills."""
@@ -140,7 +138,7 @@ async def get_skills(
140
138
  # Get each skill using the cached getter
141
139
  result = []
142
140
  for name in available_skills:
143
- skill = get_defillama_skill(name, store)
141
+ skill = get_defillama_skill(name)
144
142
  if skill:
145
143
  result.append(skill)
146
144
  return result
@@ -148,13 +146,11 @@ async def get_skills(
148
146
 
149
147
  def get_defillama_skill(
150
148
  name: str,
151
- store: SkillStoreABC,
152
149
  ) -> DefiLlamaBaseTool:
153
150
  """Get a DeFi Llama skill by name.
154
151
 
155
152
  Args:
156
153
  name: The name of the skill to get
157
- store: The skill store for persisting data
158
154
 
159
155
  Returns:
160
156
  The requested DeFi Llama skill
@@ -167,145 +163,101 @@ def get_defillama_skill(
167
163
  # TVL Skills
168
164
  if name == "fetch_protocols":
169
165
  if name not in _cache:
170
- _cache[name] = DefiLlamaFetchProtocols(
171
- skill_store=store,
172
- )
166
+ _cache[name] = DefiLlamaFetchProtocols()
173
167
  return _cache[name]
174
168
  elif name == "fetch_protocol":
175
169
  if name not in _cache:
176
- _cache[name] = DefiLlamaFetchProtocol(
177
- skill_store=store,
178
- )
170
+ _cache[name] = DefiLlamaFetchProtocol()
179
171
  return _cache[name]
180
172
  elif name == "fetch_historical_tvl":
181
173
  if name not in _cache:
182
- _cache[name] = DefiLlamaFetchHistoricalTvl(
183
- skill_store=store,
184
- )
174
+ _cache[name] = DefiLlamaFetchHistoricalTvl()
185
175
  return _cache[name]
186
176
  elif name == "fetch_chain_historical_tvl":
187
177
  if name not in _cache:
188
- _cache[name] = DefiLlamaFetchChainHistoricalTvl(
189
- skill_store=store,
190
- )
178
+ _cache[name] = DefiLlamaFetchChainHistoricalTvl()
191
179
  return _cache[name]
192
180
  elif name == "fetch_protocol_current_tvl":
193
181
  if name not in _cache:
194
- _cache[name] = DefiLlamaFetchProtocolCurrentTvl(
195
- skill_store=store,
196
- )
182
+ _cache[name] = DefiLlamaFetchProtocolCurrentTvl()
197
183
  return _cache[name]
198
184
  elif name == "fetch_chains":
199
185
  if name not in _cache:
200
- _cache[name] = DefiLlamaFetchChains(
201
- skill_store=store,
202
- )
186
+ _cache[name] = DefiLlamaFetchChains()
203
187
  return _cache[name]
204
188
 
205
189
  # Coins Skills
206
190
  elif name == "fetch_current_prices":
207
191
  if name not in _cache:
208
- _cache[name] = DefiLlamaFetchCurrentPrices(
209
- skill_store=store,
210
- )
192
+ _cache[name] = DefiLlamaFetchCurrentPrices()
211
193
  return _cache[name]
212
194
  elif name == "fetch_historical_prices":
213
195
  if name not in _cache:
214
- _cache[name] = DefiLlamaFetchHistoricalPrices(
215
- skill_store=store,
216
- )
196
+ _cache[name] = DefiLlamaFetchHistoricalPrices()
217
197
  return _cache[name]
218
198
  elif name == "fetch_batch_historical_prices":
219
199
  if name not in _cache:
220
- _cache[name] = DefiLlamaFetchBatchHistoricalPrices(
221
- skill_store=store,
222
- )
200
+ _cache[name] = DefiLlamaFetchBatchHistoricalPrices()
223
201
  return _cache[name]
224
202
  elif name == "fetch_price_chart":
225
203
  if name not in _cache:
226
- _cache[name] = DefiLlamaFetchPriceChart(
227
- skill_store=store,
228
- )
204
+ _cache[name] = DefiLlamaFetchPriceChart()
229
205
  return _cache[name]
230
206
  elif name == "fetch_price_percentage":
231
207
  if name not in _cache:
232
- _cache[name] = DefiLlamaFetchPricePercentage(
233
- skill_store=store,
234
- )
208
+ _cache[name] = DefiLlamaFetchPricePercentage()
235
209
  return _cache[name]
236
210
  elif name == "fetch_first_price":
237
211
  if name not in _cache:
238
- _cache[name] = DefiLlamaFetchFirstPrice(
239
- skill_store=store,
240
- )
212
+ _cache[name] = DefiLlamaFetchFirstPrice()
241
213
  return _cache[name]
242
214
  elif name == "fetch_block":
243
215
  if name not in _cache:
244
- _cache[name] = DefiLlamaFetchBlock(
245
- skill_store=store,
246
- )
216
+ _cache[name] = DefiLlamaFetchBlock()
247
217
  return _cache[name]
248
218
 
249
219
  # Stablecoins Skills
250
220
  elif name == "fetch_stablecoins":
251
221
  if name not in _cache:
252
- _cache[name] = DefiLlamaFetchStablecoins(
253
- skill_store=store,
254
- )
222
+ _cache[name] = DefiLlamaFetchStablecoins()
255
223
  return _cache[name]
256
224
  elif name == "fetch_stablecoin_charts":
257
225
  if name not in _cache:
258
- _cache[name] = DefiLlamaFetchStablecoinCharts(
259
- skill_store=store,
260
- )
226
+ _cache[name] = DefiLlamaFetchStablecoinCharts()
261
227
  return _cache[name]
262
228
  elif name == "fetch_stablecoin_chains":
263
229
  if name not in _cache:
264
- _cache[name] = DefiLlamaFetchStablecoinChains(
265
- skill_store=store,
266
- )
230
+ _cache[name] = DefiLlamaFetchStablecoinChains()
267
231
  return _cache[name]
268
232
  elif name == "fetch_stablecoin_prices":
269
233
  if name not in _cache:
270
- _cache[name] = DefiLlamaFetchStablecoinPrices(
271
- skill_store=store,
272
- )
234
+ _cache[name] = DefiLlamaFetchStablecoinPrices()
273
235
  return _cache[name]
274
236
 
275
237
  # Yields Skills
276
238
  elif name == "fetch_pools":
277
239
  if name not in _cache:
278
- _cache[name] = DefiLlamaFetchPools(
279
- skill_store=store,
280
- )
240
+ _cache[name] = DefiLlamaFetchPools()
281
241
  return _cache[name]
282
242
  elif name == "fetch_pool_chart":
283
243
  if name not in _cache:
284
- _cache[name] = DefiLlamaFetchPoolChart(
285
- skill_store=store,
286
- )
244
+ _cache[name] = DefiLlamaFetchPoolChart()
287
245
  return _cache[name]
288
246
 
289
247
  # Volumes Skills
290
248
  elif name == "fetch_dex_overview": # Handles both base and chain-specific overviews
291
249
  if name not in _cache:
292
- _cache[name] = DefiLlamaFetchDexOverview(
293
- skill_store=store,
294
- )
250
+ _cache[name] = DefiLlamaFetchDexOverview()
295
251
  return _cache[name]
296
252
  elif name == "fetch_dex_summary":
297
253
  if name not in _cache:
298
- _cache[name] = DefiLlamaFetchDexSummary(
299
- skill_store=store,
300
- )
254
+ _cache[name] = DefiLlamaFetchDexSummary()
301
255
  return _cache[name]
302
256
  elif (
303
257
  name == "fetch_options_overview"
304
258
  ): # Handles both base and chain-specific overviews
305
259
  if name not in _cache:
306
- _cache[name] = DefiLlamaFetchOptionsOverview(
307
- skill_store=store,
308
- )
260
+ _cache[name] = DefiLlamaFetchOptionsOverview()
309
261
  return _cache[name]
310
262
 
311
263
  # Fees Skills
@@ -313,9 +265,7 @@ def get_defillama_skill(
313
265
  name == "fetch_fees_overview"
314
266
  ): # Handles both base and chain-specific overviews
315
267
  if name not in _cache:
316
- _cache[name] = DefiLlamaFetchFeesOverview(
317
- skill_store=store,
318
- )
268
+ _cache[name] = DefiLlamaFetchFeesOverview()
319
269
  return _cache[name]
320
270
 
321
271
  else:
@@ -1,7 +1,6 @@
1
1
  """DeFi Llama API implementation and shared schemas."""
2
2
 
3
3
  from datetime import datetime
4
- from typing import List, Optional
5
4
 
6
5
  import httpx
7
6
 
@@ -75,7 +74,7 @@ async def fetch_chains() -> dict:
75
74
 
76
75
 
77
76
  # Coins API Functions
78
- async def fetch_current_prices(coins: List[str]) -> dict:
77
+ async def fetch_current_prices(coins: list[str]) -> dict:
79
78
  """Get current prices of tokens by contract address using a 4-hour search window."""
80
79
  coins_str = ",".join(coins)
81
80
  url = f"{DEFILLAMA_COINS_BASE_URL}/prices/current/{coins_str}?searchWidth=4h"
@@ -87,7 +86,7 @@ async def fetch_current_prices(coins: List[str]) -> dict:
87
86
  return response.json()
88
87
 
89
88
 
90
- async def fetch_historical_prices(timestamp: int, coins: List[str]) -> dict:
89
+ async def fetch_historical_prices(timestamp: int, coins: list[str]) -> dict:
91
90
  """Get historical prices of tokens by contract address using a 4-hour search window."""
92
91
  coins_str = ",".join(coins)
93
92
  url = f"{DEFILLAMA_COINS_BASE_URL}/prices/historical/{timestamp}/{coins_str}?searchWidth=4h"
@@ -112,7 +111,7 @@ async def fetch_batch_historical_prices(coins_timestamps: dict) -> dict:
112
111
  return response.json()
113
112
 
114
113
 
115
- async def fetch_price_chart(coins: List[str]) -> dict:
114
+ async def fetch_price_chart(coins: list[str]) -> dict:
116
115
  """Get historical price chart data from the past day for multiple tokens."""
117
116
  coins_str = ",".join(coins)
118
117
  start_time = int(datetime.now().timestamp()) - 86400 # now - 1 day
@@ -127,7 +126,7 @@ async def fetch_price_chart(coins: List[str]) -> dict:
127
126
  return response.json()
128
127
 
129
128
 
130
- async def fetch_price_percentage(coins: List[str]) -> dict:
129
+ async def fetch_price_percentage(coins: list[str]) -> dict:
131
130
  """Get price percentage changes for multiple tokens over a 24h period."""
132
131
  coins_str = ",".join(coins)
133
132
  current_timestamp = int(datetime.now().timestamp())
@@ -142,7 +141,7 @@ async def fetch_price_percentage(coins: List[str]) -> dict:
142
141
  return response.json()
143
142
 
144
143
 
145
- async def fetch_first_price(coins: List[str]) -> dict:
144
+ async def fetch_first_price(coins: list[str]) -> dict:
146
145
  """Get first recorded price data for multiple tokens."""
147
146
  coins_str = ",".join(coins)
148
147
  url = f"{DEFILLAMA_COINS_BASE_URL}/prices/first/{coins_str}"
@@ -179,9 +178,7 @@ async def fetch_stablecoins() -> dict:
179
178
  return response.json()
180
179
 
181
180
 
182
- async def fetch_stablecoin_charts(
183
- stablecoin_id: str, chain: Optional[str] = None
184
- ) -> dict:
181
+ async def fetch_stablecoin_charts(stablecoin_id: str, chain: str | None = None) -> dict:
185
182
  """Get historical circulating supply data for a stablecoin."""
186
183
  base_url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoincharts"
187
184
 
@@ -1,12 +1,10 @@
1
1
  """Base class for all DeFi Llama tools."""
2
2
 
3
- from datetime import datetime, timedelta, timezone
4
- from typing import Type
3
+ from datetime import UTC, datetime, timedelta
5
4
 
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.skills.base import IntentKitSkill
11
9
  from intentkit.skills.defillama.config.chains import (
12
10
  get_chain_from_alias,
@@ -27,10 +25,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
27
25
 
28
26
  name: str = Field(description="The name of the tool")
29
27
  description: str = Field(description="A description of what the tool does")
30
- args_schema: Type[BaseModel]
31
- skill_store: SkillStoreABC = Field(
32
- description="The skill store for persisting data"
33
- )
28
+ args_schema: type[BaseModel]
34
29
  base_url: str = Field(
35
30
  default=DEFILLAMA_BASE_URL, description="Base URL for DeFi Llama API"
36
31
  )
@@ -52,10 +47,8 @@ class DefiLlamaBaseTool(IntentKitSkill):
52
47
  Returns:
53
48
  Rate limit status and error message if limited
54
49
  """
55
- rate_limit = await self.skill_store.get_agent_skill_data(
56
- context.agent_id, self.name, "rate_limit"
57
- )
58
- current_time = datetime.now(tz=timezone.utc)
50
+ rate_limit = await self.get_agent_skill_data("rate_limit")
51
+ current_time = datetime.now(tz=UTC)
59
52
 
60
53
  if (
61
54
  rate_limit
@@ -67,18 +60,14 @@ class DefiLlamaBaseTool(IntentKitSkill):
67
60
  return True, "Rate limit exceeded"
68
61
 
69
62
  rate_limit["count"] += 1
70
- await self.skill_store.save_agent_skill_data(
71
- context.agent_id, self.name, "rate_limit", rate_limit
72
- )
63
+ await self.save_agent_skill_data("rate_limit", rate_limit)
73
64
  return False, None
74
65
 
75
66
  new_rate_limit = {
76
67
  "count": 1,
77
68
  "reset_time": (current_time + timedelta(minutes=interval)).isoformat(),
78
69
  }
79
- await self.skill_store.save_agent_skill_data(
80
- context.agent_id, self.name, "rate_limit", new_rate_limit
81
- )
70
+ await self.save_agent_skill_data("rate_limit", new_rate_limit)
82
71
  return False, None
83
72
 
84
73
  async def validate_chain(self, chain: str | None) -> tuple[bool, str | None]:
@@ -124,7 +113,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
124
113
  "error": True,
125
114
  "status_code": status_code,
126
115
  "message": message,
127
- "timestamp": datetime.now(tz=timezone.utc).isoformat(),
116
+ "timestamp": datetime.now(tz=UTC).isoformat(),
128
117
  }
129
118
 
130
119
  def get_current_timestamp(self) -> int:
@@ -133,4 +122,4 @@ class DefiLlamaBaseTool(IntentKitSkill):
133
122
  Returns:
134
123
  Current Unix timestamp
135
124
  """
136
- return int(datetime.now(tz=timezone.utc).timestamp())
125
+ return int(datetime.now(tz=UTC).timestamp())
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching batch historical token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_batch_historical_prices
@@ -33,7 +31,7 @@ class TokenPriceHistory(BaseModel):
33
31
  """Model representing historical price data for a single token."""
34
32
 
35
33
  symbol: str = Field(..., description="Token symbol")
36
- prices: List[HistoricalPricePoint] = Field(
34
+ prices: list[HistoricalPricePoint] = Field(
37
35
  ..., description="List of historical price points"
38
36
  )
39
37
 
@@ -41,7 +39,7 @@ class TokenPriceHistory(BaseModel):
41
39
  class FetchBatchHistoricalPricesInput(BaseModel):
42
40
  """Input schema for fetching batch historical token prices."""
43
41
 
44
- coins_timestamps: Dict[str, List[int]] = Field(
42
+ coins_timestamps: dict[str, list[int]] = Field(
45
43
  ..., description="Dictionary mapping token identifiers to lists of timestamps"
46
44
  )
47
45
 
@@ -49,11 +47,11 @@ class FetchBatchHistoricalPricesInput(BaseModel):
49
47
  class FetchBatchHistoricalPricesResponse(BaseModel):
50
48
  """Response schema for batch historical token prices."""
51
49
 
52
- coins: Dict[str, TokenPriceHistory] = Field(
50
+ coins: dict[str, TokenPriceHistory] = Field(
53
51
  default_factory=dict,
54
52
  description="Historical token prices keyed by token identifier",
55
53
  )
56
- error: Optional[str] = Field(None, description="Error message if any")
54
+ error: str | None = Field(None, description="Error message if any")
57
55
 
58
56
 
59
57
  class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
@@ -64,9 +62,9 @@ class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
64
62
 
65
63
  Example:
66
64
  prices_tool = DefiLlamaFetchBatchHistoricalPrices(
67
- skill_store=store,
65
+ ,
68
66
  agent_id="agent_123",
69
- agent_store=agent_store
67
+ agent=agent
70
68
  )
71
69
  result = await prices_tool._arun(
72
70
  coins_timestamps={
@@ -78,10 +76,10 @@ class DefiLlamaFetchBatchHistoricalPrices(DefiLlamaBaseTool):
78
76
 
79
77
  name: str = "defillama_fetch_batch_historical_prices"
80
78
  description: str = FETCH_BATCH_HISTORICAL_PRICES_PROMPT
81
- args_schema: Type[BaseModel] = FetchBatchHistoricalPricesInput
79
+ args_schema: type[BaseModel] = FetchBatchHistoricalPricesInput
82
80
 
83
81
  async def _arun(
84
- self, coins_timestamps: Dict[str, List[int]]
82
+ self, coins_timestamps: dict[str, list[int]]
85
83
  ) -> FetchBatchHistoricalPricesResponse:
86
84
  """Fetch historical prices for the given tokens at specified timestamps.
87
85
 
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching current block data via DeFi Llama API."""
2
2
 
3
- from typing import Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_block
@@ -34,9 +32,9 @@ class FetchBlockResponse(BaseModel):
34
32
  """Response schema for block data."""
35
33
 
36
34
  chain: str = Field(..., description="Normalized chain name")
37
- height: Optional[int] = Field(None, description="Block height number")
38
- timestamp: Optional[int] = Field(None, description="Unix timestamp of the block")
39
- error: Optional[str] = Field(None, description="Error message if any")
35
+ height: int | None = Field(None, description="Block height number")
36
+ timestamp: int | None = Field(None, description="Unix timestamp of the block")
37
+ error: str | None = Field(None, description="Error message if any")
40
38
 
41
39
 
42
40
  class DefiLlamaFetchBlock(DefiLlamaBaseTool):
@@ -46,16 +44,16 @@ class DefiLlamaFetchBlock(DefiLlamaBaseTool):
46
44
 
47
45
  Example:
48
46
  block_tool = DefiLlamaFetchBlock(
49
- skill_store=store,
47
+ ,
50
48
  agent_id="agent_123",
51
- agent_store=agent_store
49
+ agent=agent
52
50
  )
53
51
  result = await block_tool._arun(chain="ethereum")
54
52
  """
55
53
 
56
54
  name: str = "defillama_fetch_block"
57
55
  description: str = FETCH_BLOCK_PROMPT
58
- args_schema: Type[BaseModel] = FetchBlockInput
56
+ args_schema: type[BaseModel] = FetchBlockInput
59
57
 
60
58
  async def _arun(self, chain: str) -> FetchBlockResponse:
61
59
  """Fetch current block data for the given chain.
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_current_prices
@@ -29,13 +27,13 @@ class TokenPrice(BaseModel):
29
27
  symbol: str = Field(..., description="Token symbol")
30
28
  timestamp: int = Field(..., description="Unix timestamp of last price update")
31
29
  confidence: float = Field(..., description="Confidence score for the price data")
32
- decimals: Optional[int] = Field(None, description="Token decimals, if available")
30
+ decimals: int | None = Field(None, description="Token decimals, if available")
33
31
 
34
32
 
35
33
  class FetchCurrentPricesInput(BaseModel):
36
34
  """Input schema for fetching current token prices with a 4-hour search window."""
37
35
 
38
- coins: List[str] = Field(
36
+ coins: list[str] = Field(
39
37
  ...,
40
38
  description="List of token identifiers (e.g. 'ethereum:0x...', 'coingecko:ethereum')",
41
39
  )
@@ -44,10 +42,10 @@ class FetchCurrentPricesInput(BaseModel):
44
42
  class FetchCurrentPricesResponse(BaseModel):
45
43
  """Response schema for current token prices."""
46
44
 
47
- coins: Dict[str, TokenPrice] = Field(
45
+ coins: dict[str, TokenPrice] = Field(
48
46
  default_factory=dict, description="Token prices keyed by token identifier"
49
47
  )
50
- error: Optional[str] = Field(None, description="Error message if any")
48
+ error: str | None = Field(None, description="Error message if any")
51
49
 
52
50
 
53
51
  class DefiLlamaFetchCurrentPrices(DefiLlamaBaseTool):
@@ -58,9 +56,9 @@ class DefiLlamaFetchCurrentPrices(DefiLlamaBaseTool):
58
56
 
59
57
  Example:
60
58
  prices_tool = DefiLlamaFetchCurrentPrices(
61
- skill_store=store,
59
+ ,
62
60
  agent_id="agent_123",
63
- agent_store=agent_store
61
+ agent=agent
64
62
  )
65
63
  result = await prices_tool._arun(
66
64
  coins=["ethereum:0x...", "coingecko:bitcoin"]
@@ -69,9 +67,9 @@ class DefiLlamaFetchCurrentPrices(DefiLlamaBaseTool):
69
67
 
70
68
  name: str = "defillama_fetch_current_prices"
71
69
  description: str = FETCH_PRICES_PROMPT
72
- args_schema: Type[BaseModel] = FetchCurrentPricesInput
70
+ args_schema: type[BaseModel] = FetchCurrentPricesInput
73
71
 
74
- async def _arun(self, coins: List[str]) -> FetchCurrentPricesResponse:
72
+ async def _arun(self, coins: list[str]) -> FetchCurrentPricesResponse:
75
73
  """Fetch current prices for the given tokens.
76
74
 
77
75
  Args:
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching first recorded token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_first_price
@@ -31,7 +29,7 @@ class FirstPriceData(BaseModel):
31
29
  class FetchFirstPriceInput(BaseModel):
32
30
  """Input schema for fetching first token prices."""
33
31
 
34
- coins: List[str] = Field(
32
+ coins: list[str] = Field(
35
33
  ..., description="List of token identifiers to fetch first prices for"
36
34
  )
37
35
 
@@ -39,10 +37,10 @@ class FetchFirstPriceInput(BaseModel):
39
37
  class FetchFirstPriceResponse(BaseModel):
40
38
  """Response schema for first token prices."""
41
39
 
42
- coins: Dict[str, FirstPriceData] = Field(
40
+ coins: dict[str, FirstPriceData] = Field(
43
41
  default_factory=dict, description="First price data keyed by token identifier"
44
42
  )
45
- error: Optional[str] = Field(None, description="Error message if any")
43
+ error: str | None = Field(None, description="Error message if any")
46
44
 
47
45
 
48
46
  class DefiLlamaFetchFirstPrice(DefiLlamaBaseTool):
@@ -53,9 +51,9 @@ class DefiLlamaFetchFirstPrice(DefiLlamaBaseTool):
53
51
 
54
52
  Example:
55
53
  first_price_tool = DefiLlamaFetchFirstPrice(
56
- skill_store=store,
54
+ ,
57
55
  agent_id="agent_123",
58
- agent_store=agent_store
56
+ agent=agent
59
57
  )
60
58
  result = await first_price_tool._arun(
61
59
  coins=["ethereum:0x...", "coingecko:ethereum"]
@@ -64,9 +62,9 @@ class DefiLlamaFetchFirstPrice(DefiLlamaBaseTool):
64
62
 
65
63
  name: str = "defillama_fetch_first_price"
66
64
  description: str = FETCH_FIRST_PRICE_PROMPT
67
- args_schema: Type[BaseModel] = FetchFirstPriceInput
65
+ args_schema: type[BaseModel] = FetchFirstPriceInput
68
66
 
69
- async def _arun(self, coins: List[str]) -> FetchFirstPriceResponse:
67
+ async def _arun(self, coins: list[str]) -> FetchFirstPriceResponse:
70
68
  """Fetch first recorded prices for the given tokens.
71
69
 
72
70
  Args:
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching historical token prices via DeFi Llama API."""
2
2
 
3
- from typing import Dict, List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_historical_prices
@@ -26,9 +24,9 @@ class HistoricalTokenPrice(BaseModel):
26
24
  """Model representing historical token price data."""
27
25
 
28
26
  price: float = Field(..., description="Token price in USD at the specified time")
29
- symbol: Optional[str] = Field(None, description="Token symbol")
27
+ symbol: str | None = Field(None, description="Token symbol")
30
28
  timestamp: int = Field(..., description="Unix timestamp of the price data")
31
- decimals: Optional[int] = Field(None, description="Token decimals, if available")
29
+ decimals: int | None = Field(None, description="Token decimals, if available")
32
30
 
33
31
 
34
32
  class FetchHistoricalPricesInput(BaseModel):
@@ -37,7 +35,7 @@ class FetchHistoricalPricesInput(BaseModel):
37
35
  timestamp: int = Field(
38
36
  ..., description="Unix timestamp for historical price lookup"
39
37
  )
40
- coins: List[str] = Field(
38
+ coins: list[str] = Field(
41
39
  ...,
42
40
  description="List of token identifiers (e.g. 'ethereum:0x...', 'coingecko:ethereum')",
43
41
  )
@@ -46,11 +44,11 @@ class FetchHistoricalPricesInput(BaseModel):
46
44
  class FetchHistoricalPricesResponse(BaseModel):
47
45
  """Response schema for historical token prices."""
48
46
 
49
- coins: Dict[str, HistoricalTokenPrice] = Field(
47
+ coins: dict[str, HistoricalTokenPrice] = Field(
50
48
  default_factory=dict,
51
49
  description="Historical token prices keyed by token identifier",
52
50
  )
53
- error: Optional[str] = Field(None, description="Error message if any")
51
+ error: str | None = Field(None, description="Error message if any")
54
52
 
55
53
 
56
54
  class DefiLlamaFetchHistoricalPrices(DefiLlamaBaseTool):
@@ -61,9 +59,9 @@ class DefiLlamaFetchHistoricalPrices(DefiLlamaBaseTool):
61
59
 
62
60
  Example:
63
61
  prices_tool = DefiLlamaFetchHistoricalPrices(
64
- skill_store=store,
62
+ ,
65
63
  agent_id="agent_123",
66
- agent_store=agent_store
64
+ agent=agent
67
65
  )
68
66
  result = await prices_tool._arun(
69
67
  timestamp=1640995200, # Jan 1, 2022
@@ -73,10 +71,10 @@ class DefiLlamaFetchHistoricalPrices(DefiLlamaBaseTool):
73
71
 
74
72
  name: str = "defillama_fetch_historical_prices"
75
73
  description: str = FETCH_HISTORICAL_PRICES_PROMPT
76
- args_schema: Type[BaseModel] = FetchHistoricalPricesInput
74
+ args_schema: type[BaseModel] = FetchHistoricalPricesInput
77
75
 
78
76
  async def _arun(
79
- self, timestamp: int, coins: List[str]
77
+ self, timestamp: int, coins: list[str]
80
78
  ) -> FetchHistoricalPricesResponse:
81
79
  """Fetch historical prices for the given tokens at the specified time.
82
80