intentkit 0.8.17.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 (272) 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/user.py +21 -22
  32. intentkit/skills/acolyt/ask.py +3 -4
  33. intentkit/skills/acolyt/base.py +1 -3
  34. intentkit/skills/aixbt/base.py +1 -3
  35. intentkit/skills/aixbt/projects.py +13 -13
  36. intentkit/skills/allora/base.py +1 -3
  37. intentkit/skills/allora/price.py +2 -3
  38. intentkit/skills/base.py +15 -22
  39. intentkit/skills/basename/__init__.py +3 -5
  40. intentkit/skills/carv/__init__.py +7 -8
  41. intentkit/skills/carv/base.py +6 -6
  42. intentkit/skills/carv/fetch_news.py +3 -3
  43. intentkit/skills/carv/onchain_query.py +4 -4
  44. intentkit/skills/carv/token_info_and_price.py +5 -5
  45. intentkit/skills/casino/base.py +1 -3
  46. intentkit/skills/casino/deck_draw.py +1 -2
  47. intentkit/skills/casino/deck_shuffle.py +1 -2
  48. intentkit/skills/casino/dice_roll.py +1 -2
  49. intentkit/skills/cdp/__init__.py +3 -5
  50. intentkit/skills/cdp/base.py +1 -3
  51. intentkit/skills/chainlist/base.py +1 -3
  52. intentkit/skills/chainlist/chain_lookup.py +18 -18
  53. intentkit/skills/common/base.py +1 -3
  54. intentkit/skills/common/current_time.py +1 -2
  55. intentkit/skills/cookiefun/base.py +1 -2
  56. intentkit/skills/cookiefun/get_account_details.py +7 -7
  57. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  58. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  59. intentkit/skills/cookiefun/get_sectors.py +3 -3
  60. intentkit/skills/cookiefun/search_accounts.py +9 -9
  61. intentkit/skills/cryptocompare/api.py +2 -3
  62. intentkit/skills/cryptocompare/base.py +6 -6
  63. intentkit/skills/cryptocompare/fetch_news.py +3 -4
  64. intentkit/skills/cryptocompare/fetch_price.py +5 -6
  65. intentkit/skills/cryptocompare/fetch_top_exchanges.py +3 -4
  66. intentkit/skills/cryptocompare/fetch_top_market_cap.py +3 -4
  67. intentkit/skills/cryptocompare/fetch_top_volume.py +3 -4
  68. intentkit/skills/cryptocompare/fetch_trading_signals.py +4 -5
  69. intentkit/skills/cryptopanic/__init__.py +4 -4
  70. intentkit/skills/cryptopanic/base.py +1 -3
  71. intentkit/skills/cryptopanic/fetch_crypto_news.py +3 -5
  72. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +3 -3
  73. intentkit/skills/dapplooker/base.py +1 -3
  74. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  75. intentkit/skills/defillama/api.py +6 -9
  76. intentkit/skills/defillama/base.py +5 -6
  77. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +6 -8
  78. intentkit/skills/defillama/coins/fetch_block.py +4 -6
  79. intentkit/skills/defillama/coins/fetch_current_prices.py +6 -8
  80. intentkit/skills/defillama/coins/fetch_first_price.py +5 -7
  81. intentkit/skills/defillama/coins/fetch_historical_prices.py +7 -9
  82. intentkit/skills/defillama/coins/fetch_price_chart.py +7 -9
  83. intentkit/skills/defillama/coins/fetch_price_percentage.py +5 -7
  84. intentkit/skills/defillama/config/chains.py +1 -3
  85. intentkit/skills/defillama/fees/fetch_fees_overview.py +22 -24
  86. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +14 -16
  87. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +6 -8
  88. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +3 -5
  89. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +5 -7
  90. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  91. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +2 -4
  92. intentkit/skills/defillama/tvl/fetch_chains.py +7 -9
  93. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +2 -4
  94. intentkit/skills/defillama/tvl/fetch_protocol.py +30 -36
  95. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +1 -3
  96. intentkit/skills/defillama/tvl/fetch_protocols.py +35 -43
  97. intentkit/skills/defillama/volumes/fetch_dex_overview.py +40 -46
  98. intentkit/skills/defillama/volumes/fetch_dex_summary.py +33 -35
  99. intentkit/skills/defillama/volumes/fetch_options_overview.py +22 -26
  100. intentkit/skills/defillama/yields/fetch_pool_chart.py +8 -10
  101. intentkit/skills/defillama/yields/fetch_pools.py +24 -28
  102. intentkit/skills/dexscreener/__init__.py +2 -2
  103. intentkit/skills/dexscreener/base.py +3 -3
  104. intentkit/skills/dexscreener/get_pair_info.py +2 -2
  105. intentkit/skills/dexscreener/get_token_pairs.py +2 -2
  106. intentkit/skills/dexscreener/get_tokens_info.py +5 -5
  107. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  108. intentkit/skills/dexscreener/search_token.py +182 -182
  109. intentkit/skills/dexscreener/utils.py +15 -14
  110. intentkit/skills/dune_analytics/__init__.py +4 -4
  111. intentkit/skills/dune_analytics/base.py +1 -3
  112. intentkit/skills/dune_analytics/fetch_kol_buys.py +4 -4
  113. intentkit/skills/dune_analytics/fetch_nation_metrics.py +5 -5
  114. intentkit/skills/elfa/base.py +1 -3
  115. intentkit/skills/elfa/mention.py +19 -21
  116. intentkit/skills/elfa/stats.py +4 -4
  117. intentkit/skills/elfa/tokens.py +12 -12
  118. intentkit/skills/elfa/utils.py +25 -27
  119. intentkit/skills/enso/__init__.py +2 -2
  120. intentkit/skills/enso/base.py +5 -8
  121. intentkit/skills/enso/best_yield.py +4 -6
  122. intentkit/skills/enso/networks.py +1 -2
  123. intentkit/skills/enso/prices.py +1 -3
  124. intentkit/skills/enso/route.py +1 -3
  125. intentkit/skills/enso/tokens.py +1 -3
  126. intentkit/skills/enso/wallet.py +5 -5
  127. intentkit/skills/erc20/__init__.py +4 -6
  128. intentkit/skills/erc721/__init__.py +4 -6
  129. intentkit/skills/firecrawl/base.py +1 -3
  130. intentkit/skills/firecrawl/clear.py +1 -2
  131. intentkit/skills/firecrawl/crawl.py +9 -10
  132. intentkit/skills/firecrawl/query.py +1 -2
  133. intentkit/skills/firecrawl/scrape.py +7 -8
  134. intentkit/skills/firecrawl/utils.py +13 -13
  135. intentkit/skills/github/base.py +1 -3
  136. intentkit/skills/github/github_search.py +1 -2
  137. intentkit/skills/heurist/base.py +1 -3
  138. intentkit/skills/heurist/image_generation_animagine_xl.py +7 -8
  139. intentkit/skills/heurist/image_generation_arthemy_comics.py +7 -8
  140. intentkit/skills/heurist/image_generation_arthemy_real.py +7 -8
  141. intentkit/skills/heurist/image_generation_braindance.py +7 -8
  142. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +7 -8
  143. intentkit/skills/heurist/image_generation_flux_1_dev.py +7 -8
  144. intentkit/skills/heurist/image_generation_sdxl.py +7 -8
  145. intentkit/skills/http/base.py +1 -3
  146. intentkit/skills/http/get.py +7 -7
  147. intentkit/skills/http/post.py +9 -9
  148. intentkit/skills/http/put.py +9 -9
  149. intentkit/skills/lifi/__init__.py +4 -4
  150. intentkit/skills/lifi/base.py +1 -3
  151. intentkit/skills/lifi/token_execute.py +13 -13
  152. intentkit/skills/lifi/token_quote.py +6 -6
  153. intentkit/skills/lifi/utils.py +16 -16
  154. intentkit/skills/moralis/__init__.py +3 -3
  155. intentkit/skills/moralis/api.py +6 -7
  156. intentkit/skills/moralis/base.py +2 -4
  157. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  158. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  159. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  160. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  161. intentkit/skills/morpho/__init__.py +4 -6
  162. intentkit/skills/nation/__init__.py +2 -2
  163. intentkit/skills/nation/base.py +1 -3
  164. intentkit/skills/nation/nft_check.py +3 -4
  165. intentkit/skills/onchain.py +2 -6
  166. intentkit/skills/openai/base.py +1 -3
  167. intentkit/skills/openai/dalle_image_generation.py +1 -3
  168. intentkit/skills/openai/gpt_image_generation.py +2 -3
  169. intentkit/skills/openai/gpt_image_to_image.py +2 -3
  170. intentkit/skills/openai/image_to_text.py +1 -2
  171. intentkit/skills/portfolio/base.py +6 -6
  172. intentkit/skills/portfolio/token_balances.py +21 -21
  173. intentkit/skills/portfolio/wallet_approvals.py +7 -7
  174. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  175. intentkit/skills/portfolio/wallet_history.py +21 -21
  176. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  177. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  178. intentkit/skills/portfolio/wallet_profitability.py +7 -7
  179. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  180. intentkit/skills/portfolio/wallet_stats.py +3 -3
  181. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  182. intentkit/skills/pyth/__init__.py +3 -5
  183. intentkit/skills/slack/base.py +2 -4
  184. intentkit/skills/slack/get_channel.py +8 -8
  185. intentkit/skills/slack/get_message.py +9 -9
  186. intentkit/skills/slack/schedule_message.py +5 -5
  187. intentkit/skills/slack/send_message.py +3 -5
  188. intentkit/skills/supabase/base.py +1 -3
  189. intentkit/skills/supabase/delete_data.py +4 -4
  190. intentkit/skills/supabase/fetch_data.py +12 -12
  191. intentkit/skills/supabase/insert_data.py +4 -4
  192. intentkit/skills/supabase/invoke_function.py +6 -6
  193. intentkit/skills/supabase/update_data.py +6 -6
  194. intentkit/skills/supabase/upsert_data.py +4 -4
  195. intentkit/skills/superfluid/__init__.py +4 -6
  196. intentkit/skills/system/add_autonomous_task.py +8 -10
  197. intentkit/skills/system/edit_autonomous_task.py +12 -14
  198. intentkit/skills/system/list_autonomous_tasks.py +1 -3
  199. intentkit/skills/tavily/base.py +1 -3
  200. intentkit/skills/tavily/tavily_extract.py +1 -2
  201. intentkit/skills/tavily/tavily_search.py +1 -3
  202. intentkit/skills/token/base.py +5 -5
  203. intentkit/skills/token/erc20_transfers.py +19 -19
  204. intentkit/skills/token/token_analytics.py +3 -3
  205. intentkit/skills/token/token_price.py +13 -13
  206. intentkit/skills/token/token_search.py +9 -9
  207. intentkit/skills/twitter/base.py +3 -4
  208. intentkit/skills/twitter/follow_user.py +1 -2
  209. intentkit/skills/twitter/get_mentions.py +3 -4
  210. intentkit/skills/twitter/get_timeline.py +1 -2
  211. intentkit/skills/twitter/get_user_by_username.py +1 -2
  212. intentkit/skills/twitter/get_user_tweets.py +2 -3
  213. intentkit/skills/twitter/like_tweet.py +1 -2
  214. intentkit/skills/twitter/post_tweet.py +3 -4
  215. intentkit/skills/twitter/reply_tweet.py +3 -4
  216. intentkit/skills/twitter/retweet.py +1 -2
  217. intentkit/skills/twitter/search_tweets.py +1 -2
  218. intentkit/skills/unrealspeech/base.py +1 -3
  219. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  220. intentkit/skills/venice_audio/__init__.py +8 -9
  221. intentkit/skills/venice_audio/base.py +3 -4
  222. intentkit/skills/venice_audio/input.py +41 -41
  223. intentkit/skills/venice_audio/venice_audio.py +6 -6
  224. intentkit/skills/venice_image/__init__.py +5 -5
  225. intentkit/skills/venice_image/api.py +138 -138
  226. intentkit/skills/venice_image/base.py +3 -3
  227. intentkit/skills/venice_image/config.py +33 -35
  228. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  229. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  230. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  231. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  232. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  233. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  234. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  235. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  236. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  237. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  238. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  239. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  240. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  241. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  242. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  243. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  244. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  245. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  246. intentkit/skills/venice_image/utils.py +77 -78
  247. intentkit/skills/web_scraper/base.py +1 -3
  248. intentkit/skills/web_scraper/document_indexer.py +1 -2
  249. intentkit/skills/web_scraper/scrape_and_index.py +4 -5
  250. intentkit/skills/web_scraper/utils.py +25 -26
  251. intentkit/skills/web_scraper/website_indexer.py +10 -11
  252. intentkit/skills/weth/__init__.py +4 -6
  253. intentkit/skills/wow/__init__.py +4 -6
  254. intentkit/skills/x402/__init__.py +2 -2
  255. intentkit/skills/x402/ask_agent.py +7 -7
  256. intentkit/skills/x402/base.py +2 -1
  257. intentkit/skills/x402/http_request.py +10 -10
  258. intentkit/skills/xmtp/base.py +3 -3
  259. intentkit/skills/xmtp/price.py +2 -2
  260. intentkit/skills/xmtp/swap.py +2 -4
  261. intentkit/skills/xmtp/transfer.py +4 -6
  262. intentkit/utils/error.py +2 -2
  263. intentkit/utils/logging.py +2 -4
  264. intentkit/utils/s3.py +8 -9
  265. intentkit/utils/schema.py +5 -5
  266. intentkit/utils/slack_alert.py +7 -8
  267. {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/METADATA +3 -4
  268. intentkit-0.8.17.dev2.dist-info/RECORD +464 -0
  269. intentkit/models/generator.py +0 -347
  270. intentkit-0.8.17.dev1.dist-info/RECORD +0 -465
  271. {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/WHEEL +0 -0
  272. {intentkit-0.8.17.dev1.dist-info → intentkit-0.8.17.dev2.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import List, Type
3
2
  from urllib.parse import urljoin, urlparse
4
3
 
5
4
  import httpx
@@ -44,11 +43,11 @@ class WebsiteIndexerInput(BaseModel):
44
43
  ge=0,
45
44
  le=1000,
46
45
  )
47
- include_patterns: List[str] = Field(
46
+ include_patterns: list[str] = Field(
48
47
  description="URL patterns to include (e.g., ['/blog/', '/docs/']). If empty, all URLs are included",
49
48
  default=[],
50
49
  )
51
- exclude_patterns: List[str] = Field(
50
+ exclude_patterns: list[str] = Field(
52
51
  description="URL patterns to exclude (e.g., ['/admin/', '/private/'])",
53
52
  default=[],
54
53
  )
@@ -68,7 +67,7 @@ class WebsiteIndexer(WebScraperBaseTool):
68
67
  "This tool finds sitemaps from robots.txt, parses the XML content to extract URLs, "
69
68
  "and then uses the reliable scrape_and_index functionality for content indexing."
70
69
  )
71
- args_schema: Type[BaseModel] = WebsiteIndexerInput
70
+ args_schema: type[BaseModel] = WebsiteIndexerInput
72
71
 
73
72
  def _normalize_url(self, url: str) -> str:
74
73
  """Normalize URL by ensuring it has a proper scheme."""
@@ -106,7 +105,7 @@ class WebsiteIndexer(WebScraperBaseTool):
106
105
 
107
106
  def _extract_sitemaps_from_robots(
108
107
  self, robots_content: str, base_url: str
109
- ) -> List[str]:
108
+ ) -> list[str]:
110
109
  """Extract sitemap URLs from robots.txt content."""
111
110
  sitemaps = []
112
111
 
@@ -121,7 +120,7 @@ class WebsiteIndexer(WebScraperBaseTool):
121
120
 
122
121
  return sitemaps
123
122
 
124
- def _get_common_sitemap_patterns(self, base_url: str) -> List[str]:
123
+ def _get_common_sitemap_patterns(self, base_url: str) -> list[str]:
125
124
  """Generate common sitemap URL patterns."""
126
125
  return [
127
126
  urljoin(base_url, "/sitemap.xml"),
@@ -157,7 +156,7 @@ class WebsiteIndexer(WebScraperBaseTool):
157
156
  logger.warning(f"Could not fetch sitemap from {sitemap_url}: {e}")
158
157
  return ""
159
158
 
160
- async def _get_all_sitemap_content(self, base_url: str) -> tuple[str, List[str]]:
159
+ async def _get_all_sitemap_content(self, base_url: str) -> tuple[str, list[str]]:
161
160
  """Get all sitemap content for AI analysis."""
162
161
  all_content = []
163
162
  found_sitemaps = []
@@ -200,7 +199,7 @@ class WebsiteIndexer(WebScraperBaseTool):
200
199
  return combined_xml, found_sitemaps
201
200
 
202
201
  def _create_ai_extraction_prompt(
203
- self, sitemap_xml: str, include_patterns: List[str], exclude_patterns: List[str]
202
+ self, sitemap_xml: str, include_patterns: list[str], exclude_patterns: list[str]
204
203
  ) -> str:
205
204
  """Create a prompt for AI to extract URLs from sitemap XML."""
206
205
  filter_instructions = ""
@@ -225,7 +224,7 @@ INSTRUCTIONS:
225
224
 
226
225
  Extract the URLs now:"""
227
226
 
228
- def _parse_ai_response(self, ai_response: str) -> List[str]:
227
+ def _parse_ai_response(self, ai_response: str) -> list[str]:
229
228
  """Parse AI response to extract clean URLs."""
230
229
  urls = []
231
230
 
@@ -281,8 +280,8 @@ Extract the URLs now:"""
281
280
  max_urls: int = 50,
282
281
  chunk_size: int = DEFAULT_CHUNK_SIZE,
283
282
  chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
284
- include_patterns: List[str] = None,
285
- exclude_patterns: List[str] = None,
283
+ include_patterns: list[str] = None,
284
+ exclude_patterns: list[str] = None,
286
285
  **kwargs,
287
286
  ) -> str:
288
287
  """Discover website sitemaps, extract URLs with AI, and delegate to scrape_and_index."""
@@ -1,9 +1,10 @@
1
1
  """WETH 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 weth_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.weth.base import WethBaseTool
14
15
 
15
- if TYPE_CHECKING:
16
- from intentkit.models.agent import Agent
17
-
18
16
 
19
17
  class SkillStates(TypedDict):
20
18
  WethActionProvider_wrap_eth: SkillState
@@ -27,10 +25,10 @@ class Config(SkillConfig):
27
25
 
28
26
 
29
27
  async def get_skills(
30
- config: "Config",
28
+ config: Config,
31
29
  is_private: bool,
32
30
  agent_id: str,
33
- agent: Optional["Agent"] = None,
31
+ agent: Agent | None = None,
34
32
  **_,
35
33
  ) -> list[WethBaseTool]:
36
34
  """Get all WETH skills."""
@@ -1,9 +1,10 @@
1
1
  """WOW 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 wow_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.wow.base import WowBaseTool
14
15
 
15
- if TYPE_CHECKING:
16
- from intentkit.models.agent import Agent
17
-
18
16
 
19
17
  class SkillStates(TypedDict):
20
18
  WowActionProvider_buy_token: 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[WowBaseTool]:
38
36
  """Get all WOW skills."""
@@ -1,7 +1,7 @@
1
1
  """x402 skill category."""
2
2
 
3
3
  import logging
4
- from typing import Type, TypedDict
4
+ from typing import TypedDict
5
5
 
6
6
  from intentkit.skills.base import SkillConfig, SkillState
7
7
  from intentkit.skills.x402.ask_agent import X402AskAgent
@@ -24,7 +24,7 @@ class Config(SkillConfig):
24
24
  states: SkillStates
25
25
 
26
26
 
27
- _SKILL_BUILDERS: dict[str, Type[X402BaseSkill]] = {
27
+ _SKILL_BUILDERS: dict[str, type[X402BaseSkill]] = {
28
28
  "x402_ask_agent": X402AskAgent,
29
29
  "x402_http_request": X402HttpRequest,
30
30
  }
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Dict, Optional, Type
2
+ from typing import Any
3
3
 
4
4
  from langchain_core.tools import ToolException
5
5
  from pydantic import BaseModel, Field
@@ -16,10 +16,10 @@ class AskAgentInput(BaseModel):
16
16
 
17
17
  agent_id: str = Field(description="ID or slug of the agent to query.")
18
18
  message: str = Field(description="Message to send to the target agent.")
19
- search_mode: Optional[bool] = Field(
19
+ search_mode: bool | None = Field(
20
20
  default=None, description="Enable search mode when interacting with the agent."
21
21
  )
22
- super_mode: Optional[bool] = Field(
22
+ super_mode: bool | None = Field(
23
23
  default=None, description="Enable super mode when interacting with the agent."
24
24
  )
25
25
 
@@ -31,14 +31,14 @@ class X402AskAgent(X402BaseSkill):
31
31
  description: str = (
32
32
  "Call another agent through the x402 API and return the final agent message."
33
33
  )
34
- args_schema: Type[BaseModel] = AskAgentInput
34
+ args_schema: type[BaseModel] = AskAgentInput
35
35
 
36
36
  async def _arun(
37
37
  self,
38
38
  agent_id: str,
39
39
  message: str,
40
- search_mode: Optional[bool] = None,
41
- super_mode: Optional[bool] = None,
40
+ search_mode: bool | None = None,
41
+ super_mode: bool | None = None,
42
42
  ) -> str:
43
43
  try:
44
44
  # Use wallet provider signer to satisfy eth_account.BaseAccount interface requirements
@@ -46,7 +46,7 @@ class X402AskAgent(X402BaseSkill):
46
46
  if not base_url:
47
47
  raise ToolException("X402 API base URL is not configured.")
48
48
  target_url = f"{base_url}/x402"
49
- payload: Dict[str, Any] = {
49
+ payload: dict[str, Any] = {
50
50
  "agent_id": agent_id,
51
51
  "message": message,
52
52
  "app_id": "skill",
@@ -1,7 +1,8 @@
1
1
  import logging
2
2
  import threading
3
+ from collections.abc import AsyncIterator
3
4
  from contextlib import asynccontextmanager
4
- from typing import Any, AsyncIterator
5
+ from typing import Any
5
6
 
6
7
  from coinbase_agentkit.wallet_providers.evm_wallet_provider import (
7
8
  EvmWalletSigner as CoinbaseEvmWalletSigner,
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Dict, Optional, Type, Union
2
+ from typing import Any
3
3
  from urllib.parse import urlparse
4
4
 
5
5
  import httpx
@@ -18,22 +18,22 @@ class X402HttpRequestInput(BaseModel):
18
18
  url: str = Field(
19
19
  description="Absolute URL for the request (must include scheme and host)."
20
20
  )
21
- headers: Optional[Dict[str, str]] = Field(
21
+ headers: dict[str, str] | None = Field(
22
22
  default=None,
23
23
  description="Optional headers to include in the request.",
24
24
  )
25
- params: Optional[Dict[str, Any]] = Field(
25
+ params: dict[str, Any] | None = Field(
26
26
  default=None,
27
27
  description="Optional query parameters to include in the request.",
28
28
  )
29
- data: Optional[Union[Dict[str, Any], str]] = Field(
29
+ data: dict[str, Any] | str | None = Field(
30
30
  default=None,
31
31
  description=(
32
32
  "Optional request body. Dictionaries are sent as JSON; strings are sent as raw data. "
33
33
  "Only supported for POST requests."
34
34
  ),
35
35
  )
36
- timeout: Optional[float] = Field(
36
+ timeout: float | None = Field(
37
37
  default=30.0,
38
38
  description="Request timeout in seconds.",
39
39
  )
@@ -48,15 +48,15 @@ class X402HttpRequest(X402BaseSkill):
48
48
  "Provide the method, absolute URL, optional headers, query parameters, and request body. "
49
49
  "Returns the response status and body text."
50
50
  )
51
- args_schema: Type[BaseModel] = X402HttpRequestInput
51
+ args_schema: type[BaseModel] = X402HttpRequestInput
52
52
 
53
53
  async def _arun(
54
54
  self,
55
55
  method: str,
56
56
  url: str,
57
- headers: Optional[Dict[str, str]] = None,
58
- params: Optional[Dict[str, Any]] = None,
59
- data: Optional[Union[Dict[str, Any], str]] = None,
57
+ headers: dict[str, str] | None = None,
58
+ params: dict[str, Any] | None = None,
59
+ data: dict[str, Any] | str | None = None,
60
60
  timeout: float = 30.0,
61
61
  **_: Any,
62
62
  ) -> str:
@@ -71,7 +71,7 @@ class X402HttpRequest(X402BaseSkill):
71
71
  raise ToolException("URL must include scheme and host (absolute URL).")
72
72
 
73
73
  request_headers = dict(headers or {})
74
- request_kwargs: Dict[str, Any] = {
74
+ request_kwargs: dict[str, Any] = {
75
75
  "url": url,
76
76
  "headers": request_headers or None,
77
77
  "params": params,
@@ -1,4 +1,4 @@
1
- from typing import Dict, Literal
1
+ from typing import Literal
2
2
 
3
3
  from intentkit.skills.onchain import IntentKitOnChainSkill
4
4
 
@@ -10,7 +10,7 @@ class XmtpBaseTool(IntentKitOnChainSkill):
10
10
  response_format: Literal["content", "content_and_artifact"] = "content_and_artifact"
11
11
 
12
12
  # ChainId mapping for XMTP wallet_sendCalls (mainnet only)
13
- CHAIN_ID_HEX_BY_NETWORK: Dict[str, str] = {
13
+ CHAIN_ID_HEX_BY_NETWORK: dict[str, str] = {
14
14
  "ethereum-mainnet": "0x1", # 1
15
15
  "base-mainnet": "0x2105", # 8453
16
16
  "arbitrum-mainnet": "0xA4B1", # 42161
@@ -18,7 +18,7 @@ class XmtpBaseTool(IntentKitOnChainSkill):
18
18
  }
19
19
 
20
20
  # CDP network mapping for swap quote API (mainnet only)
21
- NETWORK_FOR_CDP_MAPPING: Dict[str, str] = {
21
+ NETWORK_FOR_CDP_MAPPING: dict[str, str] = {
22
22
  "ethereum-mainnet": "ethereum",
23
23
  "base-mainnet": "base",
24
24
  "arbitrum-mainnet": "arbitrum",
@@ -1,4 +1,4 @@
1
- from typing import Literal, Type
1
+ from typing import Literal
2
2
 
3
3
  from langchain_core.tools.base import ToolException
4
4
  from pydantic import BaseModel, Field
@@ -24,7 +24,7 @@ class XmtpGetSwapPrice(XmtpBaseTool):
24
24
  name: str = "xmtp_get_swap_price"
25
25
  description: str = "Get an indicative swap price/quote for token pair and amount on Ethereum, Base, Arbitrum, and Optimism mainnet networks using CDP."
26
26
  response_format: Literal["content", "content_and_artifact"] = "content"
27
- args_schema: Type[BaseModel] = SwapPriceInput
27
+ args_schema: type[BaseModel] = SwapPriceInput
28
28
 
29
29
  async def _arun(
30
30
  self,
@@ -1,5 +1,3 @@
1
- from typing import List, Tuple, Type
2
-
3
1
  from pydantic import BaseModel, Field
4
2
 
5
3
  from intentkit.clients.cdp import get_cdp_client
@@ -42,7 +40,7 @@ class XmtpSwap(XmtpBaseTool):
42
40
  "Returns a wallet_sendCalls payload that can include an optional approval call and the swap call. "
43
41
  "Supports Ethereum, Base, Arbitrum, and Optimism mainnet networks."
44
42
  )
45
- args_schema: Type[BaseModel] = SwapInput
43
+ args_schema: type[BaseModel] = SwapInput
46
44
 
47
45
  async def _arun(
48
46
  self,
@@ -51,7 +49,7 @@ class XmtpSwap(XmtpBaseTool):
51
49
  to_token: str,
52
50
  from_amount: str,
53
51
  slippage_bps: int = 100,
54
- ) -> Tuple[str, List[ChatMessageAttachment]]:
52
+ ) -> tuple[str, list[ChatMessageAttachment]]:
55
53
  # Input validation
56
54
  if (
57
55
  not from_address
@@ -1,5 +1,3 @@
1
- from typing import List, Optional, Tuple, Type
2
-
3
1
  from pydantic import BaseModel, Field
4
2
  from web3.exceptions import ContractLogicError
5
3
 
@@ -16,7 +14,7 @@ class TransferInput(BaseModel):
16
14
  description="The amount to transfer in human-readable format (e.g., '1.5' for 1.5 ETH, '100' for 100 USDC). Do NOT multiply by token decimals."
17
15
  )
18
16
  currency: str = Field(description="Currency symbol (e.g., 'ETH', 'USDC', 'NATION')")
19
- token_contract_address: Optional[str] = Field(
17
+ token_contract_address: str | None = Field(
20
18
  default=None,
21
19
  description="Token contract address for ERC20 transfers. Leave empty for ETH transfers.",
22
20
  )
@@ -31,7 +29,7 @@ class XmtpTransfer(XmtpBaseTool):
31
29
  that can be sent to users for signing.
32
30
  Supports Ethereum, Polygon, Base, Arbitrum, and Optimism networks (both mainnet and testnet).
33
31
  """
34
- args_schema: Type[BaseModel] = TransferInput
32
+ args_schema: type[BaseModel] = TransferInput
35
33
 
36
34
  async def _arun(
37
35
  self,
@@ -39,8 +37,8 @@ class XmtpTransfer(XmtpBaseTool):
39
37
  to_address: str,
40
38
  amount: str,
41
39
  currency: str,
42
- token_contract_address: Optional[str],
43
- ) -> Tuple[str, List[ChatMessageAttachment]]:
40
+ token_contract_address: str | None,
41
+ ) -> tuple[str, list[ChatMessageAttachment]]:
44
42
  """Create an XMTP transfer transaction request.
45
43
 
46
44
  Args:
intentkit/utils/error.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Optional, Sequence
2
+ from collections.abc import Sequence
3
3
 
4
4
  from fastapi.exceptions import RequestValidationError
5
5
  from fastapi.utils import is_body_allowed_for_status_code
@@ -17,7 +17,7 @@ logger = logging.getLogger(__name__)
17
17
  class RateLimitExceeded(Exception):
18
18
  """Rate limit exceeded"""
19
19
 
20
- def __init__(self, message: Optional[str] = "Rate limit exceeded"):
20
+ def __init__(self, message: str | None = "Rate limit exceeded"):
21
21
  self.message = message
22
22
  super().__init__(self.message)
23
23
 
@@ -4,13 +4,11 @@ Logging configuration module
4
4
 
5
5
  import json
6
6
  import logging
7
- from typing import Callable, Optional
7
+ from collections.abc import Callable
8
8
 
9
9
 
10
10
  class JsonFormatter(logging.Formatter):
11
- def __init__(
12
- self, filter_func: Optional[Callable[[logging.LogRecord], bool]] = None
13
- ):
11
+ def __init__(self, filter_func: Callable[[logging.LogRecord], bool] | None = None):
14
12
  super().__init__()
15
13
  self.filter_func = filter_func
16
14
 
intentkit/utils/s3.py CHANGED
@@ -5,7 +5,6 @@ S3 utility module for storing and retrieving images from AWS S3.
5
5
  import logging
6
6
  from enum import Enum
7
7
  from io import BytesIO
8
- from typing import Optional
9
8
 
10
9
  import boto3
11
10
  import filetype
@@ -16,10 +15,10 @@ from mypy_boto3_s3.client import S3Client
16
15
  logger = logging.getLogger(__name__)
17
16
 
18
17
  # Global variables for S3 configuration
19
- _bucket: Optional[str] = None
20
- _client: Optional[S3Client] = None
21
- _prefix: Optional[str] = None
22
- _cdn_url: Optional[str] = None
18
+ _bucket: str | None = None
19
+ _client: S3Client | None = None
20
+ _prefix: str | None = None
21
+ _cdn_url: str | None = None
23
22
 
24
23
 
25
24
  def init_s3(bucket: str, cdn_url: str, env: str) -> None:
@@ -114,7 +113,7 @@ async def store_image(url: str, key: str) -> str:
114
113
 
115
114
 
116
115
  async def store_image_bytes(
117
- image_bytes: bytes, key: str, content_type: Optional[str] = None
116
+ image_bytes: bytes, key: str, content_type: str | None = None
118
117
  ) -> str:
119
118
  """
120
119
  Store raw image bytes to S3.
@@ -185,8 +184,8 @@ class FileType(str, Enum):
185
184
  async def store_file(
186
185
  content: bytes,
187
186
  key: str,
188
- content_type: Optional[str] = None,
189
- size: Optional[int] = None,
187
+ content_type: str | None = None,
188
+ size: int | None = None,
190
189
  ) -> str:
191
190
  """Store raw file bytes with automatic content type detection."""
192
191
  if not _client or not _bucket or not _prefix or not _cdn_url:
@@ -239,7 +238,7 @@ async def store_file_bytes(
239
238
  file_bytes: bytes,
240
239
  key: str,
241
240
  file_type: FileType,
242
- size_limit_bytes: Optional[int] = None,
241
+ size_limit_bytes: int | None = None,
243
242
  ) -> str:
244
243
  """
245
244
  Store raw file bytes (image, video, sound, pdf) to S3.
intentkit/utils/schema.py CHANGED
@@ -5,10 +5,10 @@ resolving $defs references and generating nested schemas.
5
5
  """
6
6
 
7
7
  import copy
8
- from typing import Any, Dict
8
+ from typing import Any
9
9
 
10
10
 
11
- def resolve_schema_refs(schema: Dict[str, Any]) -> Dict[str, Any]:
11
+ def resolve_schema_refs(schema: dict[str, Any]) -> dict[str, Any]:
12
12
  """Recursively resolve $defs references in a JSON schema.
13
13
 
14
14
  This function takes a JSON schema with $defs references and returns
@@ -44,7 +44,7 @@ def resolve_schema_refs(schema: Dict[str, Any]) -> Dict[str, Any]:
44
44
  # Extract $defs if they exist
45
45
  defs = resolved_schema.pop("$defs", {})
46
46
 
47
- def resolve_refs(obj: Any, defs_dict: Dict[str, Any]) -> Any:
47
+ def resolve_refs(obj: Any, defs_dict: dict[str, Any]) -> Any:
48
48
  """Recursively resolve $ref in an object."""
49
49
  if isinstance(obj, dict):
50
50
  if "$ref" in obj:
@@ -78,8 +78,8 @@ def resolve_schema_refs(schema: Dict[str, Any]) -> Dict[str, Any]:
78
78
 
79
79
 
80
80
  def create_array_schema(
81
- item_schema: Dict[str, Any], resolve_refs: bool = True
82
- ) -> Dict[str, Any]:
81
+ item_schema: dict[str, Any], resolve_refs: bool = True
82
+ ) -> dict[str, Any]:
83
83
  """Create an array schema with the given item schema.
84
84
 
85
85
  Args:
@@ -3,7 +3,6 @@ Slack notification module for sending messages to Slack channels.
3
3
  """
4
4
 
5
5
  import logging
6
- from typing import Optional
7
6
 
8
7
  from slack_sdk import WebClient
9
8
  from slack_sdk.errors import SlackApiError
@@ -11,9 +10,9 @@ from slack_sdk.errors import SlackApiError
11
10
  logger = logging.getLogger(__name__)
12
11
 
13
12
  # Global variables for Slack configuration
14
- _slack_token: Optional[str] = None
15
- _slack_channel: Optional[str] = None
16
- _slack_client: Optional[WebClient] = None
13
+ _slack_token: str | None = None
14
+ _slack_channel: str | None = None
15
+ _slack_client: WebClient | None = None
17
16
 
18
17
 
19
18
  def init_slack(token: str, channel: str) -> None:
@@ -36,10 +35,10 @@ def init_slack(token: str, channel: str) -> None:
36
35
 
37
36
  def send_slack_message(
38
37
  message: str,
39
- blocks: Optional[list] = None,
40
- attachments: Optional[list] = None,
41
- thread_ts: Optional[str] = None,
42
- channel: Optional[str] = None,
38
+ blocks: list | None = None,
39
+ attachments: list | None = None,
40
+ thread_ts: str | None = None,
41
+ channel: str | None = None,
43
42
  ):
44
43
  """
45
44
  Send a message to a Slack channel.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: intentkit
3
- Version: 0.8.17.dev1
3
+ Version: 0.8.17.dev2
4
4
  Summary: Intent-based AI Agent Platform - Core Package
5
5
  Project-URL: Homepage, https://github.com/crestalnetwork/intentkit
6
6
  Project-URL: Repository, https://github.com/crestalnetwork/intentkit
@@ -34,15 +34,14 @@ Classifier: Development Status :: 4 - Beta
34
34
  Classifier: Intended Audience :: Developers
35
35
  Classifier: License :: OSI Approved :: MIT License
36
36
  Classifier: Programming Language :: Python :: 3
37
- Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Programming Language :: Python :: 3.13
38
38
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
39
39
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
40
- Requires-Python: >=3.12
40
+ Requires-Python: ==3.13.*
41
41
  Requires-Dist: aiohttp>=3.11.16
42
42
  Requires-Dist: aiosqlite>=0.21.0
43
43
  Requires-Dist: asyncpg>=0.30.0
44
44
  Requires-Dist: aws-secretsmanager-caching>=1.1.3
45
- Requires-Dist: bip32>=2.0.0
46
45
  Requires-Dist: boto3<2.0.0,>=1.37.23
47
46
  Requires-Dist: botocore>=1.35.97
48
47
  Requires-Dist: cdp-sdk>=1.31.1