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,6 +1,6 @@
1
1
  """Mention-related skills for Elfa AI API."""
2
2
 
3
- from typing import Any, Dict, List, Optional, Type
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -12,19 +12,19 @@ class ElfaGetTopMentionsInput(BaseModel):
12
12
  """Input parameters for top mentions."""
13
13
 
14
14
  ticker: str = Field(description="Stock ticker symbol (e.g., ETH, $ETH, BTC, $BTC)")
15
- timeWindow: Optional[str] = Field(
15
+ timeWindow: str | None = Field(
16
16
  "1h", description="Time window (e.g., '1h', '24h', '7d')"
17
17
  )
18
- page: Optional[int] = Field(1, description="Page number for pagination")
19
- pageSize: Optional[int] = Field(10, description="Number of items per page")
18
+ page: int | None = Field(1, description="Page number for pagination")
19
+ pageSize: int | None = Field(10, description="Number of items per page")
20
20
 
21
21
 
22
22
  class ElfaGetTopMentionsOutput(BaseModel):
23
23
  """Output structure for top mentions response."""
24
24
 
25
25
  success: bool
26
- data: Optional[List[MentionData]] = Field(None, description="List of top mentions")
27
- metadata: Optional[Dict[str, Any]] = Field(None, description="Response metadata")
26
+ data: list[MentionData] | None = Field(None, description="List of top mentions")
27
+ metadata: dict[str, Any] | None = Field(None, description="Response metadata")
28
28
 
29
29
 
30
30
  class ElfaGetTopMentions(ElfaBaseTool):
@@ -46,7 +46,7 @@ class ElfaGetTopMentions(ElfaBaseTool):
46
46
  Updated hourly. Returns engagement metrics and account information for market sentiment analysis.
47
47
 
48
48
  Use this to track public opinion, identify trending news, and monitor investor discussions."""
49
- args_schema: Type[BaseModel] = ElfaGetTopMentionsInput
49
+ args_schema: type[BaseModel] = ElfaGetTopMentionsInput
50
50
 
51
51
  async def _arun(
52
52
  self,
@@ -102,30 +102,28 @@ class ElfaGetTopMentions(ElfaBaseTool):
102
102
  class ElfaSearchMentionsInput(BaseModel):
103
103
  """Input parameters for search mentions."""
104
104
 
105
- keywords: Optional[str] = Field(
105
+ keywords: str | None = Field(
106
106
  None,
107
107
  description="Up to 5 keywords to search for, separated by commas. Phrases accepted",
108
108
  )
109
- accountName: Optional[str] = Field(
109
+ accountName: str | None = Field(
110
110
  None,
111
111
  description="Account username to filter by (optional if keywords provided)",
112
112
  )
113
- timeWindow: Optional[str] = Field("7d", description="Time window for search")
114
- limit: Optional[int] = Field(20, description="Number of results to return (max 30)")
115
- searchType: Optional[str] = Field(
116
- "or", description="Type of search ('and' or 'or')"
117
- )
118
- cursor: Optional[str] = Field(None, description="Cursor for pagination")
113
+ timeWindow: str | None = Field("7d", description="Time window for search")
114
+ limit: int | None = Field(20, description="Number of results to return (max 30)")
115
+ searchType: str | None = Field("or", description="Type of search ('and' or 'or')")
116
+ cursor: str | None = Field(None, description="Cursor for pagination")
119
117
 
120
118
 
121
119
  class ElfaSearchMentionsOutput(BaseModel):
122
120
  """Output structure for search mentions response."""
123
121
 
124
122
  success: bool
125
- data: Optional[List[MentionData]] = Field(
123
+ data: list[MentionData] | None = Field(
126
124
  None, description="List of matching mentions"
127
125
  )
128
- metadata: Optional[Dict[str, Any]] = Field(
126
+ metadata: dict[str, Any] | None = Field(
129
127
  None, description="Response metadata with cursor"
130
128
  )
131
129
 
@@ -150,16 +148,16 @@ class ElfaSearchMentions(ElfaBaseTool):
150
148
  Updated every 5 minutes. Access 30 days of recent data or historical archives.
151
149
 
152
150
  Use this for market research, brand monitoring, opinion tracking, and competitive analysis."""
153
- args_schema: Type[BaseModel] = ElfaSearchMentionsInput
151
+ args_schema: type[BaseModel] = ElfaSearchMentionsInput
154
152
 
155
153
  async def _arun(
156
154
  self,
157
- keywords: Optional[str] = None,
158
- accountName: Optional[str] = None,
155
+ keywords: str | None = None,
156
+ accountName: str | None = None,
159
157
  timeWindow: str = "7d",
160
158
  limit: int = 20,
161
159
  searchType: str = "or",
162
- cursor: Optional[str] = None,
160
+ cursor: str | None = None,
163
161
  **kwargs,
164
162
  ) -> ElfaSearchMentionsOutput:
165
163
  """
@@ -1,6 +1,6 @@
1
1
  """Smart stats skill for Elfa AI API."""
2
2
 
3
- from typing import Any, Dict, Optional, Type
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -18,8 +18,8 @@ class ElfaGetSmartStatsOutput(BaseModel):
18
18
  """Output structure for smart stats response."""
19
19
 
20
20
  success: bool
21
- data: Optional[SmartStatsData] = Field(None, description="Smart stats data")
22
- metadata: Optional[Dict[str, Any]] = Field(None, description="Response metadata")
21
+ data: SmartStatsData | None = Field(None, description="Smart stats data")
22
+ metadata: dict[str, Any] | None = Field(None, description="Response metadata")
23
23
 
24
24
 
25
25
  class ElfaGetSmartStats(ElfaBaseTool):
@@ -43,7 +43,7 @@ class ElfaGetSmartStats(ElfaBaseTool):
43
43
  description: str = """Get comprehensive social media metrics for a username including smart following count,
44
44
  engagement scores, and follower analytics. Use this for competitor analysis, influencer identification,
45
45
  and social media performance audits."""
46
- args_schema: Type[BaseModel] = ElfaGetSmartStatsInput
46
+ args_schema: type[BaseModel] = ElfaGetSmartStatsInput
47
47
 
48
48
  async def _arun(self, username: str, **kwargs) -> ElfaGetSmartStatsOutput:
49
49
  """
@@ -1,6 +1,6 @@
1
1
  """Trending tokens skill for Elfa AI API."""
2
2
 
3
- from typing import Any, Dict, List, Optional, Type
3
+ from typing import Any
4
4
 
5
5
  from pydantic import BaseModel, Field
6
6
 
@@ -11,13 +11,13 @@ from .utils import make_elfa_request
11
11
  class ElfaGetTrendingTokensInput(BaseModel):
12
12
  """Input parameters for trending tokens."""
13
13
 
14
- timeWindow: Optional[str] = Field(
14
+ timeWindow: str | None = Field(
15
15
  "7d",
16
16
  description="Time window for trending analysis (e.g., '30m', '1h', '4h', '24h', '7d', '30d')",
17
17
  )
18
- page: Optional[int] = Field(1, description="Page number for pagination")
19
- pageSize: Optional[int] = Field(50, description="Number of items per page")
20
- minMentions: Optional[int] = Field(
18
+ page: int | None = Field(1, description="Page number for pagination")
19
+ pageSize: int | None = Field(50, description="Number of items per page")
20
+ minMentions: int | None = Field(
21
21
  5, description="Minimum number of mentions required"
22
22
  )
23
23
 
@@ -25,20 +25,20 @@ class ElfaGetTrendingTokensInput(BaseModel):
25
25
  class TrendingToken(BaseModel):
26
26
  """Individual trending token data."""
27
27
 
28
- token: Optional[str] = Field(None, description="Token symbol")
29
- current_count: Optional[int] = Field(None, description="Current mention count")
30
- previous_count: Optional[int] = Field(None, description="Previous mention count")
31
- change_percent: Optional[float] = Field(None, description="Change percentage")
28
+ token: str | None = Field(None, description="Token symbol")
29
+ current_count: int | None = Field(None, description="Current mention count")
30
+ previous_count: int | None = Field(None, description="Previous mention count")
31
+ change_percent: float | None = Field(None, description="Change percentage")
32
32
 
33
33
 
34
34
  class ElfaGetTrendingTokensOutput(BaseModel):
35
35
  """Output structure for trending tokens response."""
36
36
 
37
37
  success: bool
38
- data: Optional[List[TrendingToken]] = Field(
38
+ data: list[TrendingToken] | None = Field(
39
39
  None, description="List of trending tokens"
40
40
  )
41
- metadata: Optional[Dict[str, Any]] = Field(None, description="Response metadata")
41
+ metadata: dict[str, Any] | None = Field(None, description="Response metadata")
42
42
 
43
43
 
44
44
  class ElfaGetTrendingTokens(ElfaBaseTool):
@@ -60,7 +60,7 @@ class ElfaGetTrendingTokens(ElfaBaseTool):
60
60
  Updated every 5 minutes. Smart mentions provide sophisticated discussion volume measurement beyond simple keyword counts.
61
61
 
62
62
  Use this to identify tokens gaining traction, gauge market sentiment, and research potential investments."""
63
- args_schema: Type[BaseModel] = ElfaGetTrendingTokensInput
63
+ args_schema: type[BaseModel] = ElfaGetTrendingTokensInput
64
64
 
65
65
  async def _arun(
66
66
  self,
@@ -1,6 +1,6 @@
1
1
  """Utility functions for Elfa skills."""
2
2
 
3
- from typing import Any, Dict, Optional
3
+ from typing import Any
4
4
 
5
5
  import httpx
6
6
  from langchain_core.tools.base import ToolException
@@ -14,13 +14,13 @@ class ElfaResponse(BaseModel):
14
14
 
15
15
  success: bool
16
16
  data: Any = None
17
- metadata: Optional[Dict[str, Any]] = None
17
+ metadata: dict[str, Any] | None = None
18
18
 
19
19
 
20
20
  async def make_elfa_request(
21
21
  endpoint: str,
22
22
  api_key: str,
23
- params: Optional[Dict[str, Any]] = None,
23
+ params: dict[str, Any] | None = None,
24
24
  timeout: int = 30,
25
25
  ) -> ElfaResponse:
26
26
  """
@@ -82,32 +82,32 @@ async def make_elfa_request(
82
82
  class RepostBreakdown(BaseModel):
83
83
  """Repost breakdown data."""
84
84
 
85
- smart: Optional[int] = None
86
- ct: Optional[int] = None
85
+ smart: int | None = None
86
+ ct: int | None = None
87
87
 
88
88
 
89
89
  class Account(BaseModel):
90
90
  """Account information."""
91
91
 
92
- username: Optional[str] = None
93
- isVerified: Optional[bool] = None
92
+ username: str | None = None
93
+ isVerified: bool | None = None
94
94
 
95
95
 
96
96
  class MentionData(BaseModel):
97
97
  """Base mention data structure used across multiple endpoints."""
98
98
 
99
- tweetId: Optional[str] = Field(None, description="Tweet ID")
100
- link: Optional[str] = Field(None, description="Link to the tweet")
101
- likeCount: Optional[int] = Field(None, description="Number of likes")
102
- repostCount: Optional[int] = Field(None, description="Number of reposts")
103
- viewCount: Optional[int] = Field(None, description="Number of views")
104
- quoteCount: Optional[int] = Field(None, description="Number of quotes")
105
- replyCount: Optional[int] = Field(None, description="Number of replies")
106
- bookmarkCount: Optional[int] = Field(None, description="Number of bookmarks")
107
- mentionedAt: Optional[str] = Field(None, description="When mentioned")
108
- type: Optional[str] = Field(None, description="Post type")
109
- account: Optional[Account] = Field(None, description="Account information")
110
- repostBreakdown: Optional[RepostBreakdown] = Field(
99
+ tweetId: str | None = Field(None, description="Tweet ID")
100
+ link: str | None = Field(None, description="Link to the tweet")
101
+ likeCount: int | None = Field(None, description="Number of likes")
102
+ repostCount: int | None = Field(None, description="Number of reposts")
103
+ viewCount: int | None = Field(None, description="Number of views")
104
+ quoteCount: int | None = Field(None, description="Number of quotes")
105
+ replyCount: int | None = Field(None, description="Number of replies")
106
+ bookmarkCount: int | None = Field(None, description="Number of bookmarks")
107
+ mentionedAt: str | None = Field(None, description="When mentioned")
108
+ type: str | None = Field(None, description="Post type")
109
+ account: Account | None = Field(None, description="Account information")
110
+ repostBreakdown: RepostBreakdown | None = Field(
111
111
  None, description="Repost breakdown"
112
112
  )
113
113
 
@@ -115,15 +115,13 @@ class MentionData(BaseModel):
115
115
  class SmartStatsData(BaseModel):
116
116
  """Smart stats data structure."""
117
117
 
118
- smartFollowingCount: Optional[int] = Field(
119
- None, description="Smart following count"
120
- )
121
- averageEngagement: Optional[float] = Field(None, description="Average engagement")
122
- averageReach: Optional[float] = Field(None, description="Average reach")
123
- smartFollowerCount: Optional[int] = Field(None, description="Smart follower count")
124
- followerCount: Optional[int] = Field(None, description="Total follower count")
118
+ smartFollowingCount: int | None = Field(None, description="Smart following count")
119
+ averageEngagement: float | None = Field(None, description="Average engagement")
120
+ averageReach: float | None = Field(None, description="Average reach")
121
+ smartFollowerCount: int | None = Field(None, description="Smart follower count")
122
+ followerCount: int | None = Field(None, description="Total follower count")
125
123
 
126
124
 
127
- def clean_params(params: Dict[str, Any]) -> Dict[str, Any]:
125
+ def clean_params(params: dict[str, Any]) -> dict[str, Any]:
128
126
  """Remove None values from parameters dict."""
129
127
  return {k: v for k, v in params.items() if v is not None}
@@ -1,7 +1,7 @@
1
1
  """Enso skills."""
2
2
 
3
3
  import logging
4
- from typing import List, NotRequired, TypedDict
4
+ from typing import NotRequired, TypedDict
5
5
 
6
6
  from intentkit.skills.base import SkillConfig, SkillState
7
7
  from intentkit.skills.enso.base import EnsoBaseTool
@@ -35,7 +35,7 @@ class Config(SkillConfig):
35
35
 
36
36
  states: SkillStates
37
37
  api_token: NotRequired[str]
38
- main_tokens: NotRequired[List[str]]
38
+ main_tokens: NotRequired[list[str]]
39
39
 
40
40
 
41
41
  async def get_skills(
@@ -1,5 +1,4 @@
1
1
  from decimal import Decimal
2
- from typing import Optional, Type
3
2
 
4
3
  from coinbase_agentkit import CdpEvmWalletProvider
5
4
  from langchain_core.tools.base import ToolException
@@ -19,7 +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]
21
+ args_schema: type[BaseModel]
23
22
 
24
23
  async def get_wallet_provider(self, context: AgentContext) -> CdpEvmWalletProvider:
25
24
  """Get the wallet provider from the CDP client.
@@ -28,7 +27,7 @@ class EnsoBaseTool(IntentKitSkill):
28
27
  context: The skill context containing agent information.
29
28
 
30
29
  Returns:
31
- Optional[CdpEvmWalletProvider]: The wallet provider if available.
30
+ CdpEvmWalletProvider | None: The wallet provider if available.
32
31
  """
33
32
  return await get_agent_wallet_provider(context.agent)
34
33
 
@@ -36,7 +35,7 @@ class EnsoBaseTool(IntentKitSkill):
36
35
  provider: CdpEvmWalletProvider = await self.get_wallet_provider(context)
37
36
  return provider.get_address()
38
37
 
39
- def get_chain_provider(self, context: AgentContext) -> Optional[ChainProvider]:
38
+ def get_chain_provider(self, context: AgentContext) -> ChainProvider | None:
40
39
  return config.chain_provider
41
40
 
42
41
  def get_main_tokens(self, context: AgentContext) -> list[str]:
@@ -59,7 +58,7 @@ class EnsoBaseTool(IntentKitSkill):
59
58
  )
60
59
 
61
60
  def resolve_chain_id(
62
- self, context: AgentContext, chain_id: Optional[int] = None
61
+ self, context: AgentContext, chain_id: int | None = None
63
62
  ) -> int:
64
63
  if chain_id:
65
64
  return chain_id
@@ -84,9 +83,7 @@ class EnsoBaseTool(IntentKitSkill):
84
83
  return "enso"
85
84
 
86
85
 
87
- def format_amount_with_decimals(
88
- amount: object, decimals: Optional[int]
89
- ) -> Optional[str]:
86
+ def format_amount_with_decimals(amount: object, decimals: int | None) -> str | None:
90
87
  if amount is None or decimals is None:
91
88
  return None
92
89
 
@@ -1,5 +1,3 @@
1
- from typing import List, Optional, Type
2
-
3
1
  import httpx
4
2
  from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
@@ -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,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  import httpx
5
4
  from langchain_core.tools.base import ToolException
@@ -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
  """
@@ -1,5 +1,3 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
2
  from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
@@ -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,5 +1,3 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
2
  from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
@@ -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,
@@ -1,5 +1,3 @@
1
- from typing import Type
2
-
3
1
  import httpx
4
2
  from langchain_core.tools.base import ToolException
5
3
  from pydantic import BaseModel, Field
@@ -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,
@@ -1,4 +1,4 @@
1
- from typing import Literal, Tuple, Type
1
+ from typing import Literal
2
2
 
3
3
  import httpx
4
4
  from langchain_core.tools.base import ToolException
@@ -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,9 +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.models.agent import Agent
7
8
  from intentkit.skills.base import (
8
9
  SkillConfig,
9
10
  SkillState,
@@ -12,9 +13,6 @@ from intentkit.skills.base import (
12
13
  )
13
14
  from intentkit.skills.erc20.base import ERC20BaseTool
14
15
 
15
- if TYPE_CHECKING:
16
- from intentkit.models.agent import Agent
17
-
18
16
 
19
17
  class SkillStates(TypedDict):
20
18
  ERC20ActionProvider_get_balance: SkillState
@@ -28,10 +26,10 @@ class Config(SkillConfig):
28
26
 
29
27
 
30
28
  async def get_skills(
31
- config: "Config",
29
+ config: Config,
32
30
  is_private: bool,
33
31
  agent_id: str,
34
- agent: Optional["Agent"] = None,
32
+ agent: Agent | None = None,
35
33
  **_,
36
34
  ) -> list[ERC20BaseTool]:
37
35
  """Get all ERC20 skills."""
@@ -1,9 +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.models.agent import Agent
7
8
  from intentkit.skills.base import (
8
9
  SkillConfig,
9
10
  SkillState,
@@ -12,9 +13,6 @@ from intentkit.skills.base import (
12
13
  )
13
14
  from intentkit.skills.erc721.base import ERC721BaseTool
14
15
 
15
- if TYPE_CHECKING:
16
- from intentkit.models.agent import Agent
17
-
18
16
 
19
17
  class SkillStates(TypedDict):
20
18
  Erc721ActionProvider_get_balance: SkillState
@@ -29,10 +27,10 @@ class Config(SkillConfig):
29
27
 
30
28
 
31
29
  async def get_skills(
32
- config: "Config",
30
+ config: Config,
33
31
  is_private: bool,
34
32
  agent_id: str,
35
- agent: Optional["Agent"] = None,
33
+ agent: Agent | None = None,
36
34
  **_,
37
35
  ) -> list[ERC721BaseTool]:
38
36
  """Get all ERC721 skills."""
@@ -1,5 +1,3 @@
1
- from typing import Type
2
-
3
1
  from langchain_core.tools.base import ToolException
4
2
  from pydantic import BaseModel, Field
5
3
 
@@ -12,7 +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]
13
+ args_schema: type[BaseModel]
16
14
 
17
15
  def get_api_key(self) -> str:
18
16
  """Get the Firecrawl API key from configuration."""
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from pydantic import BaseModel, Field
5
4
 
@@ -31,7 +30,7 @@ class FirecrawlClearIndexedContent(FirecrawlBaseTool):
31
30
  "This will permanently delete all indexed content and cannot be undone.\n"
32
31
  "Use this tool when you want to start fresh with new content."
33
32
  )
34
- args_schema: Type[BaseModel] = FirecrawlClearInput
33
+ args_schema: type[BaseModel] = FirecrawlClearInput
35
34
 
36
35
  async def _arun(
37
36
  self,
@@ -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,