intentkit 0.8.16.dev1__py3-none-any.whl → 0.8.17.dev2__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 (274) 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 +6 -5
  5. intentkit/abstracts/skill.py +5 -5
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/cdp.py +19 -77
  8. intentkit/clients/twitter.py +26 -34
  9. intentkit/clients/web3.py +1 -3
  10. intentkit/config/config.py +4 -0
  11. intentkit/core/agent.py +15 -15
  12. intentkit/core/asset.py +1 -2
  13. intentkit/core/client.py +1 -1
  14. intentkit/core/credit.py +19 -20
  15. intentkit/core/engine.py +2 -4
  16. intentkit/core/node.py +2 -1
  17. intentkit/core/prompt.py +3 -4
  18. intentkit/core/scheduler.py +1 -1
  19. intentkit/core/statistics.py +6 -7
  20. intentkit/models/agent.py +125 -92
  21. intentkit/models/agent_data.py +62 -36
  22. intentkit/models/app_setting.py +6 -6
  23. intentkit/models/chat.py +27 -24
  24. intentkit/models/conversation.py +8 -8
  25. intentkit/models/credit.py +62 -64
  26. intentkit/models/db.py +8 -7
  27. intentkit/models/db_mig.py +2 -2
  28. intentkit/models/llm.py +12 -14
  29. intentkit/models/redis.py +2 -3
  30. intentkit/models/skill.py +25 -27
  31. intentkit/models/skills.csv +29 -28
  32. intentkit/models/user.py +21 -22
  33. intentkit/skills/acolyt/ask.py +3 -4
  34. intentkit/skills/acolyt/base.py +1 -3
  35. intentkit/skills/aixbt/base.py +1 -3
  36. intentkit/skills/aixbt/projects.py +13 -13
  37. intentkit/skills/allora/base.py +1 -3
  38. intentkit/skills/allora/price.py +2 -3
  39. intentkit/skills/base.py +15 -22
  40. intentkit/skills/basename/__init__.py +3 -5
  41. intentkit/skills/carv/__init__.py +7 -8
  42. intentkit/skills/carv/base.py +6 -6
  43. intentkit/skills/carv/fetch_news.py +3 -3
  44. intentkit/skills/carv/onchain_query.py +4 -4
  45. intentkit/skills/carv/token_info_and_price.py +5 -5
  46. intentkit/skills/casino/base.py +1 -3
  47. intentkit/skills/casino/deck_draw.py +1 -2
  48. intentkit/skills/casino/deck_shuffle.py +1 -2
  49. intentkit/skills/casino/dice_roll.py +1 -2
  50. intentkit/skills/cdp/__init__.py +3 -5
  51. intentkit/skills/cdp/base.py +1 -3
  52. intentkit/skills/chainlist/base.py +1 -3
  53. intentkit/skills/chainlist/chain_lookup.py +18 -18
  54. intentkit/skills/common/base.py +1 -3
  55. intentkit/skills/common/current_time.py +1 -2
  56. intentkit/skills/cookiefun/base.py +1 -2
  57. intentkit/skills/cookiefun/get_account_details.py +7 -7
  58. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  59. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  60. intentkit/skills/cookiefun/get_sectors.py +3 -3
  61. intentkit/skills/cookiefun/search_accounts.py +9 -9
  62. intentkit/skills/cryptocompare/api.py +2 -3
  63. intentkit/skills/cryptocompare/base.py +6 -6
  64. intentkit/skills/cryptocompare/fetch_news.py +3 -4
  65. intentkit/skills/cryptocompare/fetch_price.py +5 -6
  66. intentkit/skills/cryptocompare/fetch_top_exchanges.py +3 -4
  67. intentkit/skills/cryptocompare/fetch_top_market_cap.py +3 -4
  68. intentkit/skills/cryptocompare/fetch_top_volume.py +3 -4
  69. intentkit/skills/cryptocompare/fetch_trading_signals.py +4 -5
  70. intentkit/skills/cryptopanic/__init__.py +4 -4
  71. intentkit/skills/cryptopanic/base.py +1 -3
  72. intentkit/skills/cryptopanic/fetch_crypto_news.py +3 -5
  73. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +3 -3
  74. intentkit/skills/dapplooker/base.py +1 -3
  75. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  76. intentkit/skills/defillama/api.py +6 -9
  77. intentkit/skills/defillama/base.py +5 -6
  78. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +6 -8
  79. intentkit/skills/defillama/coins/fetch_block.py +4 -6
  80. intentkit/skills/defillama/coins/fetch_current_prices.py +6 -8
  81. intentkit/skills/defillama/coins/fetch_first_price.py +5 -7
  82. intentkit/skills/defillama/coins/fetch_historical_prices.py +7 -9
  83. intentkit/skills/defillama/coins/fetch_price_chart.py +7 -9
  84. intentkit/skills/defillama/coins/fetch_price_percentage.py +5 -7
  85. intentkit/skills/defillama/config/chains.py +1 -3
  86. intentkit/skills/defillama/fees/fetch_fees_overview.py +22 -24
  87. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +14 -16
  88. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +6 -8
  89. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +3 -5
  90. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +5 -7
  91. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  92. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +2 -4
  93. intentkit/skills/defillama/tvl/fetch_chains.py +7 -9
  94. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +2 -4
  95. intentkit/skills/defillama/tvl/fetch_protocol.py +30 -36
  96. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +1 -3
  97. intentkit/skills/defillama/tvl/fetch_protocols.py +35 -43
  98. intentkit/skills/defillama/volumes/fetch_dex_overview.py +40 -46
  99. intentkit/skills/defillama/volumes/fetch_dex_summary.py +33 -35
  100. intentkit/skills/defillama/volumes/fetch_options_overview.py +22 -26
  101. intentkit/skills/defillama/yields/fetch_pool_chart.py +8 -10
  102. intentkit/skills/defillama/yields/fetch_pools.py +24 -28
  103. intentkit/skills/dexscreener/__init__.py +2 -2
  104. intentkit/skills/dexscreener/base.py +3 -3
  105. intentkit/skills/dexscreener/get_pair_info.py +2 -2
  106. intentkit/skills/dexscreener/get_token_pairs.py +2 -2
  107. intentkit/skills/dexscreener/get_tokens_info.py +5 -5
  108. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  109. intentkit/skills/dexscreener/search_token.py +182 -182
  110. intentkit/skills/dexscreener/utils.py +15 -14
  111. intentkit/skills/dune_analytics/__init__.py +4 -4
  112. intentkit/skills/dune_analytics/base.py +1 -3
  113. intentkit/skills/dune_analytics/fetch_kol_buys.py +4 -4
  114. intentkit/skills/dune_analytics/fetch_nation_metrics.py +5 -5
  115. intentkit/skills/elfa/base.py +1 -3
  116. intentkit/skills/elfa/mention.py +19 -21
  117. intentkit/skills/elfa/stats.py +4 -4
  118. intentkit/skills/elfa/tokens.py +12 -12
  119. intentkit/skills/elfa/utils.py +25 -27
  120. intentkit/skills/enso/__init__.py +2 -2
  121. intentkit/skills/enso/base.py +5 -8
  122. intentkit/skills/enso/best_yield.py +4 -6
  123. intentkit/skills/enso/networks.py +1 -2
  124. intentkit/skills/enso/prices.py +1 -3
  125. intentkit/skills/enso/route.py +1 -3
  126. intentkit/skills/enso/tokens.py +1 -3
  127. intentkit/skills/enso/wallet.py +5 -5
  128. intentkit/skills/erc20/__init__.py +4 -6
  129. intentkit/skills/erc721/__init__.py +4 -6
  130. intentkit/skills/firecrawl/base.py +1 -3
  131. intentkit/skills/firecrawl/clear.py +1 -2
  132. intentkit/skills/firecrawl/crawl.py +9 -10
  133. intentkit/skills/firecrawl/query.py +1 -2
  134. intentkit/skills/firecrawl/scrape.py +7 -8
  135. intentkit/skills/firecrawl/utils.py +13 -13
  136. intentkit/skills/github/base.py +1 -3
  137. intentkit/skills/github/github_search.py +1 -2
  138. intentkit/skills/heurist/base.py +1 -3
  139. intentkit/skills/heurist/image_generation_animagine_xl.py +7 -8
  140. intentkit/skills/heurist/image_generation_arthemy_comics.py +7 -8
  141. intentkit/skills/heurist/image_generation_arthemy_real.py +7 -8
  142. intentkit/skills/heurist/image_generation_braindance.py +7 -8
  143. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +7 -8
  144. intentkit/skills/heurist/image_generation_flux_1_dev.py +7 -8
  145. intentkit/skills/heurist/image_generation_sdxl.py +7 -8
  146. intentkit/skills/http/base.py +1 -3
  147. intentkit/skills/http/get.py +7 -7
  148. intentkit/skills/http/post.py +9 -9
  149. intentkit/skills/http/put.py +9 -9
  150. intentkit/skills/lifi/__init__.py +4 -4
  151. intentkit/skills/lifi/base.py +1 -3
  152. intentkit/skills/lifi/token_execute.py +13 -13
  153. intentkit/skills/lifi/token_quote.py +6 -6
  154. intentkit/skills/lifi/utils.py +16 -16
  155. intentkit/skills/moralis/__init__.py +3 -3
  156. intentkit/skills/moralis/api.py +6 -7
  157. intentkit/skills/moralis/base.py +2 -4
  158. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  159. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  160. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  161. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  162. intentkit/skills/morpho/__init__.py +4 -6
  163. intentkit/skills/nation/__init__.py +2 -2
  164. intentkit/skills/nation/base.py +1 -3
  165. intentkit/skills/nation/nft_check.py +3 -4
  166. intentkit/skills/onchain.py +2 -6
  167. intentkit/skills/openai/base.py +1 -3
  168. intentkit/skills/openai/dalle_image_generation.py +1 -3
  169. intentkit/skills/openai/gpt_image_generation.py +2 -3
  170. intentkit/skills/openai/gpt_image_to_image.py +2 -3
  171. intentkit/skills/openai/image_to_text.py +1 -2
  172. intentkit/skills/portfolio/base.py +6 -6
  173. intentkit/skills/portfolio/token_balances.py +21 -21
  174. intentkit/skills/portfolio/wallet_approvals.py +7 -7
  175. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  176. intentkit/skills/portfolio/wallet_history.py +21 -21
  177. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  178. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  179. intentkit/skills/portfolio/wallet_profitability.py +7 -7
  180. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  181. intentkit/skills/portfolio/wallet_stats.py +3 -3
  182. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  183. intentkit/skills/pyth/__init__.py +3 -5
  184. intentkit/skills/slack/base.py +2 -4
  185. intentkit/skills/slack/get_channel.py +8 -8
  186. intentkit/skills/slack/get_message.py +9 -9
  187. intentkit/skills/slack/schedule_message.py +5 -5
  188. intentkit/skills/slack/send_message.py +3 -5
  189. intentkit/skills/supabase/base.py +1 -3
  190. intentkit/skills/supabase/delete_data.py +4 -4
  191. intentkit/skills/supabase/fetch_data.py +12 -12
  192. intentkit/skills/supabase/insert_data.py +4 -4
  193. intentkit/skills/supabase/invoke_function.py +6 -6
  194. intentkit/skills/supabase/update_data.py +6 -6
  195. intentkit/skills/supabase/upsert_data.py +4 -4
  196. intentkit/skills/superfluid/__init__.py +4 -6
  197. intentkit/skills/system/add_autonomous_task.py +8 -10
  198. intentkit/skills/system/edit_autonomous_task.py +12 -14
  199. intentkit/skills/system/list_autonomous_tasks.py +1 -3
  200. intentkit/skills/tavily/base.py +1 -3
  201. intentkit/skills/tavily/tavily_extract.py +1 -2
  202. intentkit/skills/tavily/tavily_search.py +1 -3
  203. intentkit/skills/token/base.py +5 -5
  204. intentkit/skills/token/erc20_transfers.py +19 -19
  205. intentkit/skills/token/token_analytics.py +3 -3
  206. intentkit/skills/token/token_price.py +13 -13
  207. intentkit/skills/token/token_search.py +9 -9
  208. intentkit/skills/twitter/base.py +3 -4
  209. intentkit/skills/twitter/follow_user.py +1 -2
  210. intentkit/skills/twitter/get_mentions.py +3 -4
  211. intentkit/skills/twitter/get_timeline.py +1 -2
  212. intentkit/skills/twitter/get_user_by_username.py +1 -2
  213. intentkit/skills/twitter/get_user_tweets.py +2 -3
  214. intentkit/skills/twitter/like_tweet.py +1 -2
  215. intentkit/skills/twitter/post_tweet.py +3 -4
  216. intentkit/skills/twitter/reply_tweet.py +3 -4
  217. intentkit/skills/twitter/retweet.py +1 -2
  218. intentkit/skills/twitter/search_tweets.py +1 -2
  219. intentkit/skills/unrealspeech/base.py +1 -3
  220. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  221. intentkit/skills/venice_audio/__init__.py +8 -9
  222. intentkit/skills/venice_audio/base.py +3 -4
  223. intentkit/skills/venice_audio/input.py +41 -41
  224. intentkit/skills/venice_audio/venice_audio.py +6 -6
  225. intentkit/skills/venice_image/__init__.py +5 -5
  226. intentkit/skills/venice_image/api.py +138 -138
  227. intentkit/skills/venice_image/base.py +3 -3
  228. intentkit/skills/venice_image/config.py +33 -35
  229. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  230. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  231. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  232. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  233. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  234. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  235. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  236. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  237. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  238. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  239. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  240. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  241. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  242. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  243. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  244. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  245. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  246. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  247. intentkit/skills/venice_image/utils.py +77 -78
  248. intentkit/skills/web_scraper/base.py +1 -3
  249. intentkit/skills/web_scraper/document_indexer.py +1 -2
  250. intentkit/skills/web_scraper/scrape_and_index.py +4 -5
  251. intentkit/skills/web_scraper/utils.py +25 -26
  252. intentkit/skills/web_scraper/website_indexer.py +10 -11
  253. intentkit/skills/weth/__init__.py +4 -6
  254. intentkit/skills/wow/__init__.py +4 -6
  255. intentkit/skills/x402/__init__.py +11 -3
  256. intentkit/skills/x402/ask_agent.py +12 -78
  257. intentkit/skills/x402/base.py +90 -0
  258. intentkit/skills/x402/http_request.py +117 -0
  259. intentkit/skills/x402/schema.json +15 -10
  260. intentkit/skills/xmtp/base.py +3 -3
  261. intentkit/skills/xmtp/price.py +2 -2
  262. intentkit/skills/xmtp/swap.py +2 -4
  263. intentkit/skills/xmtp/transfer.py +4 -6
  264. intentkit/utils/error.py +2 -2
  265. intentkit/utils/logging.py +2 -4
  266. intentkit/utils/s3.py +8 -9
  267. intentkit/utils/schema.py +5 -5
  268. intentkit/utils/slack_alert.py +7 -8
  269. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/METADATA +3 -4
  270. intentkit-0.8.17.dev2.dist-info/RECORD +464 -0
  271. intentkit/models/generator.py +0 -347
  272. intentkit-0.8.16.dev1.dist-info/RECORD +0 -464
  273. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/WHEEL +0 -0
  274. {intentkit-0.8.16.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching options overview data 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_options_overview
@@ -20,16 +18,14 @@ Returns detailed metrics including:
20
18
  class ProtocolMethodology(BaseModel):
21
19
  """Model representing protocol methodology data."""
22
20
 
23
- UserFees: Optional[str] = Field(None, description="User fees description")
24
- Fees: Optional[str] = Field(None, description="Fees description")
25
- Revenue: Optional[str] = Field(None, description="Revenue description")
26
- ProtocolRevenue: Optional[str] = Field(
21
+ UserFees: str | None = Field(None, description="User fees description")
22
+ Fees: str | None = Field(None, description="Fees description")
23
+ Revenue: str | None = Field(None, description="Revenue description")
24
+ ProtocolRevenue: str | None = Field(
27
25
  None, description="Protocol revenue description"
28
26
  )
29
- HoldersRevenue: Optional[str] = Field(
30
- None, description="Holders revenue description"
31
- )
32
- SupplySideRevenue: Optional[str] = Field(
27
+ HoldersRevenue: str | None = Field(None, description="Holders revenue description")
28
+ SupplySideRevenue: str | None = Field(
33
29
  None, description="Supply side revenue description"
34
30
  )
35
31
 
@@ -42,23 +38,23 @@ class Protocol(BaseModel):
42
38
  defillamaId: str = Field(..., description="DeFi Llama ID")
43
39
  category: str = Field(..., description="Protocol category")
44
40
  logo: str = Field(..., description="Logo URL")
45
- chains: List[str] = Field(..., description="Supported chains")
41
+ chains: list[str] = Field(..., description="Supported chains")
46
42
  module: str = Field(..., description="Protocol module")
47
- total24h: Optional[float] = Field(None, description="24-hour total")
48
- total7d: Optional[float] = Field(None, description="7-day total")
49
- total30d: Optional[float] = Field(None, description="30-day total")
50
- total1y: Optional[float] = Field(None, description="1-year total")
51
- totalAllTime: Optional[float] = Field(None, description="All-time total")
52
- change_1d: Optional[float] = Field(None, description="24-hour change percentage")
53
- change_7d: Optional[float] = Field(None, description="7-day change percentage")
54
- change_1m: Optional[float] = Field(None, description="30-day change percentage")
55
- methodology: Optional[ProtocolMethodology] = Field(
43
+ total24h: float | None = Field(None, description="24-hour total")
44
+ total7d: float | None = Field(None, description="7-day total")
45
+ total30d: float | None = Field(None, description="30-day total")
46
+ total1y: float | None = Field(None, description="1-year total")
47
+ totalAllTime: float | None = Field(None, description="All-time total")
48
+ change_1d: float | None = Field(None, description="24-hour change percentage")
49
+ change_7d: float | None = Field(None, description="7-day change percentage")
50
+ change_1m: float | None = Field(None, description="30-day change percentage")
51
+ methodology: ProtocolMethodology | None = Field(
56
52
  None, description="Protocol methodology"
57
53
  )
58
- breakdown24h: Optional[Dict[str, Dict[str, float]]] = Field(
54
+ breakdown24h: dict[str, dict[str, float]] | None = Field(
59
55
  None, description="24-hour breakdown by chain"
60
56
  )
61
- breakdown30d: Optional[Dict[str, Dict[str, float]]] = Field(
57
+ breakdown30d: dict[str, dict[str, float]] | None = Field(
62
58
  None, description="30-day breakdown by chain"
63
59
  )
64
60
 
@@ -73,9 +69,9 @@ class FetchOptionsOverviewResponse(BaseModel):
73
69
  change_1d: float = Field(..., description="24-hour change percentage")
74
70
  change_7d: float = Field(..., description="7-day change percentage")
75
71
  change_1m: float = Field(..., description="30-day change percentage")
76
- allChains: List[str] = Field(..., description="List of all chains")
77
- protocols: List[Protocol] = Field(..., description="List of protocols")
78
- error: Optional[str] = Field(None, description="Error message if any")
72
+ allChains: list[str] = Field(..., description="List of all chains")
73
+ protocols: list[Protocol] = Field(..., description="List of protocols")
74
+ error: str | None = Field(None, description="Error message if any")
79
75
 
80
76
 
81
77
  class DefiLlamaFetchOptionsOverview(DefiLlamaBaseTool):
@@ -101,7 +97,7 @@ class DefiLlamaFetchOptionsOverview(DefiLlamaBaseTool):
101
97
 
102
98
  pass
103
99
 
104
- args_schema: Type[BaseModel] = EmptyArgsSchema
100
+ args_schema: type[BaseModel] = EmptyArgsSchema
105
101
 
106
102
  async def _arun(self, **kwargs) -> FetchOptionsOverviewResponse:
107
103
  """Fetch overview data for all options protocols.
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching pool chart data via DeFi Llama API."""
2
2
 
3
- from typing import List, Optional, Type
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_pool_chart
@@ -23,11 +21,11 @@ class PoolDataPoint(BaseModel):
23
21
 
24
22
  timestamp: str = Field(..., description="ISO formatted timestamp of the data point")
25
23
  tvlUsd: float = Field(..., description="Total Value Locked in USD")
26
- apy: Optional[float] = Field(None, description="Total APY including rewards")
27
- apyBase: Optional[float] = Field(None, description="Base APY without rewards")
28
- apyReward: Optional[float] = Field(None, description="Additional APY from rewards")
29
- il7d: Optional[float] = Field(None, description="7-day impermanent loss")
30
- apyBase7d: Optional[float] = Field(None, description="7-day base APY")
24
+ apy: float | None = Field(None, description="Total APY including rewards")
25
+ apyBase: float | None = Field(None, description="Base APY without rewards")
26
+ apyReward: float | None = Field(None, description="Additional APY from rewards")
27
+ il7d: float | None = Field(None, description="7-day impermanent loss")
28
+ apyBase7d: float | None = Field(None, description="7-day base APY")
31
29
 
32
30
 
33
31
  class FetchPoolChartInput(BaseModel):
@@ -40,10 +38,10 @@ class FetchPoolChartResponse(BaseModel):
40
38
  """Response schema for pool chart data."""
41
39
 
42
40
  status: str = Field("success", description="Response status")
43
- data: List[PoolDataPoint] = Field(
41
+ data: list[PoolDataPoint] = Field(
44
42
  default_factory=list, description="List of historical data points"
45
43
  )
46
- error: Optional[str] = Field(None, description="Error message if any")
44
+ error: str | None = Field(None, description="Error message if any")
47
45
 
48
46
 
49
47
  class DefiLlamaFetchPoolChart(DefiLlamaBaseTool):
@@ -65,7 +63,7 @@ class DefiLlamaFetchPoolChart(DefiLlamaBaseTool):
65
63
 
66
64
  name: str = "defillama_fetch_pool_chart"
67
65
  description: str = FETCH_POOL_CHART_PROMPT
68
- args_schema: Type[BaseModel] = FetchPoolChartInput
66
+ args_schema: type[BaseModel] = FetchPoolChartInput
69
67
 
70
68
  async def _arun(self, pool_id: str) -> FetchPoolChartResponse:
71
69
  """Fetch historical chart data for the given pool.
@@ -1,7 +1,5 @@
1
1
  """Tool for fetching pool data via DeFi Llama API."""
2
2
 
3
- from typing import Optional
4
-
5
3
  from pydantic import BaseModel, Field
6
4
 
7
5
  from intentkit.skills.defillama.api import fetch_pools
@@ -21,13 +19,13 @@ Returns data including:
21
19
  class PredictionData(BaseModel):
22
20
  """Model representing prediction data for a pool."""
23
21
 
24
- predictedClass: Optional[str] = Field(
22
+ predictedClass: str | None = Field(
25
23
  None, description="Predicted direction of APY movement"
26
24
  )
27
- predictedProbability: Optional[float] = Field(
25
+ predictedProbability: float | None = Field(
28
26
  None, description="Probability of the prediction"
29
27
  )
30
- binnedConfidence: Optional[int] = Field(None, description="Confidence level bucket")
28
+ binnedConfidence: int | None = Field(None, description="Confidence level bucket")
31
29
 
32
30
 
33
31
  class PoolData(BaseModel):
@@ -37,38 +35,36 @@ class PoolData(BaseModel):
37
35
  project: str = Field(..., description="Protocol or project name")
38
36
  symbol: str = Field(..., description="Token or pool symbol")
39
37
  tvlUsd: float = Field(..., description="Total Value Locked in USD")
40
- apyBase: Optional[float] = Field(None, description="Base APY without rewards")
41
- apyReward: Optional[float] = Field(None, description="Additional APY from rewards")
42
- apy: Optional[float] = Field(None, description="Total APY including rewards")
43
- rewardTokens: Optional[list[str]] = Field(
38
+ apyBase: float | None = Field(None, description="Base APY without rewards")
39
+ apyReward: float | None = Field(None, description="Additional APY from rewards")
40
+ apy: float | None = Field(None, description="Total APY including rewards")
41
+ rewardTokens: list[str] | None = Field(
44
42
  None, description="List of reward token addresses"
45
43
  )
46
- pool: Optional[str] = Field(None, description="Pool identifier")
47
- apyPct1D: Optional[float] = Field(None, description="1-day APY percentage change")
48
- apyPct7D: Optional[float] = Field(None, description="7-day APY percentage change")
49
- apyPct30D: Optional[float] = Field(None, description="30-day APY percentage change")
44
+ pool: str | None = Field(None, description="Pool identifier")
45
+ apyPct1D: float | None = Field(None, description="1-day APY percentage change")
46
+ apyPct7D: float | None = Field(None, description="7-day APY percentage change")
47
+ apyPct30D: float | None = Field(None, description="30-day APY percentage change")
50
48
  stablecoin: bool = Field(False, description="Whether pool involves stablecoins")
51
49
  ilRisk: str = Field("no", description="Impermanent loss risk assessment")
52
50
  exposure: str = Field("single", description="Asset exposure type")
53
- predictions: Optional[PredictionData] = Field(
51
+ predictions: PredictionData | None = Field(
54
52
  None, description="APY movement predictions"
55
53
  )
56
- poolMeta: Optional[str] = Field(None, description="Additional pool metadata")
57
- mu: Optional[float] = Field(None, description="Mean APY value")
58
- sigma: Optional[float] = Field(None, description="APY standard deviation")
59
- count: Optional[int] = Field(None, description="Number of data points")
54
+ poolMeta: str | None = Field(None, description="Additional pool metadata")
55
+ mu: float | None = Field(None, description="Mean APY value")
56
+ sigma: float | None = Field(None, description="APY standard deviation")
57
+ count: int | None = Field(None, description="Number of data points")
60
58
  outlier: bool = Field(False, description="Whether pool is an outlier")
61
- underlyingTokens: Optional[list[str]] = Field(
59
+ underlyingTokens: list[str] | None = Field(
62
60
  None, description="List of underlying token addresses"
63
61
  )
64
- il7d: Optional[float] = Field(None, description="7-day impermanent loss")
65
- apyBase7d: Optional[float] = Field(None, description="7-day base APY")
66
- apyMean30d: Optional[float] = Field(None, description="30-day mean APY")
67
- volumeUsd1d: Optional[float] = Field(None, description="24h volume in USD")
68
- volumeUsd7d: Optional[float] = Field(None, description="7-day volume in USD")
69
- apyBaseInception: Optional[float] = Field(
70
- None, description="Base APY since inception"
71
- )
62
+ il7d: float | None = Field(None, description="7-day impermanent loss")
63
+ apyBase7d: float | None = Field(None, description="7-day base APY")
64
+ apyMean30d: float | None = Field(None, description="30-day mean APY")
65
+ volumeUsd1d: float | None = Field(None, description="24h volume in USD")
66
+ volumeUsd7d: float | None = Field(None, description="7-day volume in USD")
67
+ apyBaseInception: float | None = Field(None, description="Base APY since inception")
72
68
 
73
69
 
74
70
  class FetchPoolsResponse(BaseModel):
@@ -76,7 +72,7 @@ class FetchPoolsResponse(BaseModel):
76
72
 
77
73
  status: str = Field("success", description="Response status")
78
74
  data: list[PoolData] = Field(default_factory=list, description="List of pool data")
79
- error: Optional[str] = Field(None, description="Error message if any")
75
+ error: str | None = Field(None, description="Error message if any")
80
76
 
81
77
 
82
78
  class DefiLlamaFetchPools(DefiLlamaBaseTool):
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Optional, TypedDict
2
+ from typing import TypedDict
3
3
 
4
4
  from intentkit.skills.base import SkillConfig, SkillState
5
5
  from intentkit.skills.dexscreener.base import DexScreenerBaseTool
@@ -74,7 +74,7 @@ async def get_skills(
74
74
 
75
75
  def get_dexscreener_skills(
76
76
  name: str,
77
- ) -> Optional[DexScreenerBaseTool]:
77
+ ) -> DexScreenerBaseTool | None:
78
78
  """Get a DexScreener skill by name.
79
79
 
80
80
  Args:
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  import logging
3
- from typing import Any, Dict, Optional, Tuple
3
+ from typing import Any
4
4
 
5
5
  import httpx
6
6
 
@@ -10,7 +10,7 @@ from intentkit.skills.dexscreener.utils import DEXSCREENER_BASE_URL
10
10
  logger = logging.getLogger(__name__)
11
11
 
12
12
  # ApiResult still represents (success_data, error_data)
13
- ApiResult = Tuple[Optional[Dict[str, Any]], Optional[Dict[str, Any]]]
13
+ ApiResult = tuple[dict[str, Any] | None, dict[str, Any] | None]
14
14
 
15
15
 
16
16
  class DexScreenerBaseTool(IntentKitSkill):
@@ -28,7 +28,7 @@ class DexScreenerBaseTool(IntentKitSkill):
28
28
  async def _get(
29
29
  self,
30
30
  path: str,
31
- params: Optional[Dict[str, Any]] = None,
31
+ params: dict[str, Any] | None = None,
32
32
  ) -> ApiResult:
33
33
  """
34
34
  Makes an asynchronous GET request to the DexScreener API.
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Type
2
+ from typing import Any
3
3
 
4
4
  from pydantic import BaseModel, Field
5
5
 
@@ -39,7 +39,7 @@ class GetPairInfo(DexScreenerBaseTool):
39
39
  "market cap, FDV, transaction counts, and social links. "
40
40
  "Use this tool when you have a specific pair address and need detailed trading metrics."
41
41
  )
42
- args_schema: Type[BaseModel] = GetPairInfoInput
42
+ args_schema: type[BaseModel] = GetPairInfoInput
43
43
 
44
44
  async def _arun(
45
45
  self,
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Type
2
+ from typing import Any
3
3
 
4
4
  from pydantic import BaseModel, Field, ValidationError
5
5
 
@@ -44,7 +44,7 @@ class GetTokenPairs(DexScreenerBaseTool):
44
44
  "DEX information, liquidity, volume, and pricing data for each pair. "
45
45
  "Use this tool to analyze all available trading venues and liquidity sources for a specific token."
46
46
  )
47
- args_schema: Type[BaseModel] = GetTokenPairsInput
47
+ args_schema: type[BaseModel] = GetTokenPairsInput
48
48
 
49
49
  async def _arun(
50
50
  self,
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, List, Type
2
+ from typing import Any
3
3
 
4
4
  from pydantic import BaseModel, Field, ValidationError, field_validator
5
5
 
@@ -29,14 +29,14 @@ class GetTokensInfoInput(BaseModel):
29
29
  chain_id: str = Field(
30
30
  description="The blockchain chain ID (e.g., 'ethereum', 'solana', 'bsc', 'polygon', 'arbitrum', 'base', 'avalanche')"
31
31
  )
32
- token_addresses: List[str] = Field(
32
+ token_addresses: list[str] = Field(
33
33
  description=f"List of token contract addresses to retrieve info for (maximum {MAX_TOKENS_BATCH} addresses). "
34
34
  "Each address should be in the format '0x1234...abcd' for Ethereum-based chains."
35
35
  )
36
36
 
37
37
  @field_validator("token_addresses")
38
38
  @classmethod
39
- def validate_token_addresses(cls, v: List[str]) -> List[str]:
39
+ def validate_token_addresses(cls, v: list[str]) -> list[str]:
40
40
  if not v:
41
41
  raise ValueError("At least one token address is required")
42
42
  if len(v) > MAX_TOKENS_BATCH:
@@ -64,12 +64,12 @@ class GetTokensInfo(DexScreenerBaseTool):
64
64
  "This is more efficient than making individual calls when you need info for multiple tokens. "
65
65
  "Use this tool for portfolio analysis or comparing multiple tokens at once."
66
66
  )
67
- args_schema: Type[BaseModel] = GetTokensInfoInput
67
+ args_schema: type[BaseModel] = GetTokensInfoInput
68
68
 
69
69
  async def _arun(
70
70
  self,
71
71
  chain_id: str,
72
- token_addresses: List[str],
72
+ token_addresses: list[str],
73
73
  **kwargs: Any,
74
74
  ) -> str:
75
75
  """Implementation to get information for multiple tokens."""
@@ -1,82 +1,80 @@
1
- from typing import List, Optional
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class TokenModel(BaseModel):
7
- address: Optional[str] = None
8
- name: Optional[str] = None
9
- symbol: Optional[str] = None
10
-
11
-
12
- class TxnsDetailsModel(BaseModel):
13
- buys: Optional[int] = None
14
- sells: Optional[int] = None
15
-
16
-
17
- class TxnsModel(BaseModel):
18
- m5: Optional[TxnsDetailsModel] = None
19
- h1: Optional[TxnsDetailsModel] = None
20
- h6: Optional[TxnsDetailsModel] = None
21
- h24: Optional[TxnsDetailsModel] = None
22
-
23
-
24
- class VolumeModel(BaseModel):
25
- h24: Optional[float] = None
26
- h6: Optional[float] = None
27
- h1: Optional[float] = None
28
- m5: Optional[float] = None
29
-
30
-
31
- class PriceChangeModel(BaseModel):
32
- m5: Optional[float] = None
33
- h1: Optional[float] = None
34
- h6: Optional[float] = None
35
- h24: Optional[float] = None
36
-
37
-
38
- class LiquidityModel(BaseModel):
39
- usd: Optional[float] = None
40
- base: Optional[float] = None
41
- quote: Optional[float] = None
42
-
43
-
44
- class WebsiteModel(BaseModel):
45
- label: Optional[str] = None
46
- url: Optional[str] = None
47
-
48
-
49
- class SocialModel(BaseModel):
50
- type: Optional[str] = None
51
- url: Optional[str] = None
52
-
53
-
54
- class InfoModel(BaseModel):
55
- imageUrl: Optional[str] = None
56
- websites: Optional[List[Optional[WebsiteModel]]] = None
57
- socials: Optional[List[Optional[SocialModel]]] = None
58
-
59
-
60
- class PairModel(BaseModel):
61
- chainId: Optional[str] = None
62
- dexId: Optional[str] = None
63
- url: Optional[str] = None
64
- pairAddress: Optional[str] = None
65
- labels: Optional[List[Optional[str]]] = None
66
- baseToken: Optional[TokenModel] = None
67
- quoteToken: Optional[TokenModel] = None
68
- priceNative: Optional[str] = None
69
- priceUsd: Optional[str] = None
70
- txns: Optional[TxnsModel] = None
71
- volume: Optional[VolumeModel] = None
72
- priceChange: Optional[PriceChangeModel] = None
73
- liquidity: Optional[LiquidityModel] = None
74
- fdv: Optional[float] = None
75
- marketCap: Optional[float] = None
76
- pairCreatedAt: Optional[int] = None
77
- info: Optional[InfoModel] = None
78
-
79
-
80
- class SearchTokenResponseModel(BaseModel):
81
- schemaVersion: Optional[str] = None
82
- pairs: Optional[List[Optional[PairModel]]] = None
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class TokenModel(BaseModel):
5
+ address: str | None = None
6
+ name: str | None = None
7
+ symbol: str | None = None
8
+
9
+
10
+ class TxnsDetailsModel(BaseModel):
11
+ buys: int | None = None
12
+ sells: int | None = None
13
+
14
+
15
+ class TxnsModel(BaseModel):
16
+ m5: TxnsDetailsModel | None = None
17
+ h1: TxnsDetailsModel | None = None
18
+ h6: TxnsDetailsModel | None = None
19
+ h24: TxnsDetailsModel | None = None
20
+
21
+
22
+ class VolumeModel(BaseModel):
23
+ h24: float | None = None
24
+ h6: float | None = None
25
+ h1: float | None = None
26
+ m5: float | None = None
27
+
28
+
29
+ class PriceChangeModel(BaseModel):
30
+ m5: float | None = None
31
+ h1: float | None = None
32
+ h6: float | None = None
33
+ h24: float | None = None
34
+
35
+
36
+ class LiquidityModel(BaseModel):
37
+ usd: float | None = None
38
+ base: float | None = None
39
+ quote: float | None = None
40
+
41
+
42
+ class WebsiteModel(BaseModel):
43
+ label: str | None = None
44
+ url: str | None = None
45
+
46
+
47
+ class SocialModel(BaseModel):
48
+ type: str | None = None
49
+ url: str | None = None
50
+
51
+
52
+ class InfoModel(BaseModel):
53
+ imageUrl: str | None = None
54
+ websites: list[WebsiteModel | None] | None = None
55
+ socials: list[SocialModel | None] | None = None
56
+
57
+
58
+ class PairModel(BaseModel):
59
+ chainId: str | None = None
60
+ dexId: str | None = None
61
+ url: str | None = None
62
+ pairAddress: str | None = None
63
+ labels: list[str | None] | None = None
64
+ baseToken: TokenModel | None = None
65
+ quoteToken: TokenModel | None = None
66
+ priceNative: str | None = None
67
+ priceUsd: str | None = None
68
+ txns: TxnsModel | None = None
69
+ volume: VolumeModel | None = None
70
+ priceChange: PriceChangeModel | None = None
71
+ liquidity: LiquidityModel | None = None
72
+ fdv: float | None = None
73
+ marketCap: float | None = None
74
+ pairCreatedAt: int | None = None
75
+ info: InfoModel | None = None
76
+
77
+
78
+ class SearchTokenResponseModel(BaseModel):
79
+ schemaVersion: str | None = None
80
+ pairs: list[PairModel | None] | None = None