intentkit 0.8.6.dev2__py3-none-any.whl → 0.8.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of intentkit might be problematic. Click here for more details.

Files changed (312) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +10 -5
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +3 -2
  8. intentkit/clients/cdp.py +53 -92
  9. intentkit/clients/twitter.py +56 -57
  10. intentkit/clients/web3.py +1 -3
  11. intentkit/config/config.py +5 -0
  12. intentkit/core/agent.py +16 -388
  13. intentkit/core/asset.py +64 -18
  14. intentkit/core/client.py +1 -1
  15. intentkit/core/credit.py +19 -20
  16. intentkit/core/engine.py +26 -11
  17. intentkit/core/node.py +2 -1
  18. intentkit/core/prompt.py +53 -15
  19. intentkit/core/scheduler.py +9 -9
  20. intentkit/core/statistics.py +6 -7
  21. intentkit/models/agent.py +256 -176
  22. intentkit/models/agent_data.py +62 -36
  23. intentkit/models/agent_schema.json +6 -9
  24. intentkit/models/app_setting.py +6 -6
  25. intentkit/models/chat.py +28 -24
  26. intentkit/models/conversation.py +8 -8
  27. intentkit/models/credit.py +62 -64
  28. intentkit/models/db.py +8 -7
  29. intentkit/models/db_mig.py +2 -2
  30. intentkit/models/llm.csv +15 -12
  31. intentkit/models/llm.py +18 -16
  32. intentkit/models/redis.py +2 -3
  33. intentkit/models/skill.py +62 -66
  34. intentkit/models/skills.csv +30 -26
  35. intentkit/models/user.py +46 -21
  36. intentkit/skills/acolyt/__init__.py +2 -9
  37. intentkit/skills/acolyt/ask.py +3 -4
  38. intentkit/skills/acolyt/base.py +4 -9
  39. intentkit/skills/aixbt/__init__.py +2 -13
  40. intentkit/skills/aixbt/base.py +1 -7
  41. intentkit/skills/aixbt/projects.py +14 -15
  42. intentkit/skills/allora/__init__.py +2 -9
  43. intentkit/skills/allora/base.py +4 -9
  44. intentkit/skills/allora/price.py +3 -4
  45. intentkit/skills/base.py +175 -52
  46. intentkit/skills/basename/__init__.py +4 -8
  47. intentkit/skills/carv/__init__.py +115 -121
  48. intentkit/skills/carv/base.py +184 -185
  49. intentkit/skills/carv/fetch_news.py +3 -3
  50. intentkit/skills/carv/onchain_query.py +4 -4
  51. intentkit/skills/carv/token_info_and_price.py +5 -5
  52. intentkit/skills/casino/__init__.py +4 -15
  53. intentkit/skills/casino/base.py +1 -7
  54. intentkit/skills/casino/deck_draw.py +5 -8
  55. intentkit/skills/casino/deck_shuffle.py +6 -6
  56. intentkit/skills/casino/dice_roll.py +2 -4
  57. intentkit/skills/cdp/__init__.py +3 -10
  58. intentkit/skills/cdp/base.py +1 -7
  59. intentkit/skills/cdp/schema.json +1 -17
  60. intentkit/skills/chainlist/__init__.py +2 -7
  61. intentkit/skills/chainlist/base.py +1 -7
  62. intentkit/skills/chainlist/chain_lookup.py +18 -18
  63. intentkit/skills/common/__init__.py +2 -9
  64. intentkit/skills/common/base.py +1 -7
  65. intentkit/skills/common/current_time.py +1 -2
  66. intentkit/skills/cookiefun/__init__.py +6 -9
  67. intentkit/skills/cookiefun/base.py +2 -7
  68. intentkit/skills/cookiefun/get_account_details.py +7 -7
  69. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  70. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  71. intentkit/skills/cookiefun/get_sectors.py +3 -3
  72. intentkit/skills/cookiefun/search_accounts.py +9 -9
  73. intentkit/skills/cryptocompare/__init__.py +7 -24
  74. intentkit/skills/cryptocompare/api.py +2 -3
  75. intentkit/skills/cryptocompare/base.py +10 -24
  76. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  77. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  78. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  79. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  80. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  81. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  82. intentkit/skills/cryptopanic/__init__.py +7 -10
  83. intentkit/skills/cryptopanic/base.py +51 -55
  84. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  85. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  86. intentkit/skills/dapplooker/__init__.py +2 -9
  87. intentkit/skills/dapplooker/base.py +4 -9
  88. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  89. intentkit/skills/defillama/__init__.py +24 -74
  90. intentkit/skills/defillama/api.py +6 -9
  91. intentkit/skills/defillama/base.py +8 -19
  92. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  93. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  94. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  95. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  96. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  97. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  98. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  99. intentkit/skills/defillama/config/chains.py +1 -3
  100. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  101. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  102. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  103. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  104. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  105. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  106. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  107. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  108. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  109. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  110. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  111. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  112. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  113. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  114. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  115. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  116. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  117. intentkit/skills/dexscreener/__init__.py +97 -102
  118. intentkit/skills/dexscreener/base.py +125 -130
  119. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  120. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  121. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  122. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  123. intentkit/skills/dexscreener/search_token.py +182 -184
  124. intentkit/skills/dexscreener/utils.py +15 -14
  125. intentkit/skills/dune_analytics/__init__.py +7 -9
  126. intentkit/skills/dune_analytics/base.py +48 -52
  127. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  128. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  129. intentkit/skills/elfa/__init__.py +5 -18
  130. intentkit/skills/elfa/base.py +10 -14
  131. intentkit/skills/elfa/mention.py +19 -21
  132. intentkit/skills/elfa/stats.py +4 -4
  133. intentkit/skills/elfa/tokens.py +12 -12
  134. intentkit/skills/elfa/utils.py +26 -28
  135. intentkit/skills/enso/__init__.py +11 -31
  136. intentkit/skills/enso/base.py +9 -15
  137. intentkit/skills/enso/best_yield.py +5 -7
  138. intentkit/skills/enso/networks.py +3 -9
  139. intentkit/skills/enso/prices.py +2 -4
  140. intentkit/skills/enso/route.py +6 -12
  141. intentkit/skills/enso/tokens.py +4 -16
  142. intentkit/skills/enso/wallet.py +6 -6
  143. intentkit/skills/erc20/__init__.py +5 -11
  144. intentkit/skills/erc721/__init__.py +5 -9
  145. intentkit/skills/firecrawl/__init__.py +5 -18
  146. intentkit/skills/firecrawl/base.py +4 -9
  147. intentkit/skills/firecrawl/clear.py +4 -8
  148. intentkit/skills/firecrawl/crawl.py +19 -19
  149. intentkit/skills/firecrawl/query.py +4 -3
  150. intentkit/skills/firecrawl/scrape.py +17 -22
  151. intentkit/skills/firecrawl/utils.py +50 -42
  152. intentkit/skills/github/__init__.py +2 -7
  153. intentkit/skills/github/base.py +1 -7
  154. intentkit/skills/github/github_search.py +1 -2
  155. intentkit/skills/heurist/__init__.py +8 -27
  156. intentkit/skills/heurist/base.py +4 -9
  157. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  158. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  159. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  160. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  161. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  162. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  163. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  164. intentkit/skills/http/__init__.py +4 -15
  165. intentkit/skills/http/base.py +1 -7
  166. intentkit/skills/http/get.py +21 -16
  167. intentkit/skills/http/post.py +23 -18
  168. intentkit/skills/http/put.py +23 -18
  169. intentkit/skills/lifi/__init__.py +5 -10
  170. intentkit/skills/lifi/base.py +1 -7
  171. intentkit/skills/lifi/token_execute.py +14 -17
  172. intentkit/skills/lifi/token_quote.py +7 -9
  173. intentkit/skills/lifi/utils.py +16 -16
  174. intentkit/skills/moralis/__init__.py +6 -10
  175. intentkit/skills/moralis/api.py +6 -7
  176. intentkit/skills/moralis/base.py +5 -10
  177. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  178. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  179. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  180. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  181. intentkit/skills/morpho/__init__.py +5 -9
  182. intentkit/skills/nation/__init__.py +4 -9
  183. intentkit/skills/nation/base.py +5 -10
  184. intentkit/skills/nation/nft_check.py +3 -4
  185. intentkit/skills/onchain.py +23 -0
  186. intentkit/skills/openai/__init__.py +17 -18
  187. intentkit/skills/openai/base.py +10 -14
  188. intentkit/skills/openai/dalle_image_generation.py +3 -8
  189. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  190. intentkit/skills/openai/gpt_image_generation.py +4 -8
  191. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  192. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  193. intentkit/skills/openai/image_to_text.py +3 -7
  194. intentkit/skills/openai/schema.json +32 -0
  195. intentkit/skills/portfolio/__init__.py +11 -35
  196. intentkit/skills/portfolio/base.py +33 -19
  197. intentkit/skills/portfolio/token_balances.py +21 -21
  198. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  199. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  200. intentkit/skills/portfolio/wallet_history.py +31 -31
  201. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  202. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  203. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  204. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  205. intentkit/skills/portfolio/wallet_stats.py +3 -3
  206. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  207. intentkit/skills/pyth/__init__.py +4 -10
  208. intentkit/skills/skills.toml +4 -0
  209. intentkit/skills/slack/__init__.py +5 -17
  210. intentkit/skills/slack/base.py +3 -9
  211. intentkit/skills/slack/get_channel.py +8 -8
  212. intentkit/skills/slack/get_message.py +9 -9
  213. intentkit/skills/slack/schedule_message.py +5 -5
  214. intentkit/skills/slack/send_message.py +3 -5
  215. intentkit/skills/supabase/__init__.py +7 -23
  216. intentkit/skills/supabase/base.py +1 -7
  217. intentkit/skills/supabase/delete_data.py +4 -4
  218. intentkit/skills/supabase/fetch_data.py +12 -12
  219. intentkit/skills/supabase/insert_data.py +4 -4
  220. intentkit/skills/supabase/invoke_function.py +6 -6
  221. intentkit/skills/supabase/update_data.py +6 -6
  222. intentkit/skills/supabase/upsert_data.py +4 -4
  223. intentkit/skills/superfluid/__init__.py +5 -9
  224. intentkit/skills/system/__init__.py +7 -24
  225. intentkit/skills/system/add_autonomous_task.py +10 -12
  226. intentkit/skills/system/delete_autonomous_task.py +2 -2
  227. intentkit/skills/system/edit_autonomous_task.py +14 -18
  228. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  229. intentkit/skills/system/read_agent_api_key.py +6 -4
  230. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  231. intentkit/skills/tavily/__init__.py +3 -12
  232. intentkit/skills/tavily/base.py +4 -9
  233. intentkit/skills/tavily/tavily_extract.py +2 -4
  234. intentkit/skills/tavily/tavily_search.py +4 -6
  235. intentkit/skills/token/__init__.py +5 -10
  236. intentkit/skills/token/base.py +7 -11
  237. intentkit/skills/token/erc20_transfers.py +19 -19
  238. intentkit/skills/token/token_analytics.py +3 -3
  239. intentkit/skills/token/token_price.py +13 -13
  240. intentkit/skills/token/token_search.py +9 -9
  241. intentkit/skills/twitter/__init__.py +11 -35
  242. intentkit/skills/twitter/base.py +22 -34
  243. intentkit/skills/twitter/follow_user.py +2 -6
  244. intentkit/skills/twitter/get_mentions.py +5 -12
  245. intentkit/skills/twitter/get_timeline.py +4 -12
  246. intentkit/skills/twitter/get_user_by_username.py +2 -6
  247. intentkit/skills/twitter/get_user_tweets.py +5 -13
  248. intentkit/skills/twitter/like_tweet.py +2 -6
  249. intentkit/skills/twitter/post_tweet.py +6 -9
  250. intentkit/skills/twitter/reply_tweet.py +6 -9
  251. intentkit/skills/twitter/retweet.py +2 -6
  252. intentkit/skills/twitter/search_tweets.py +4 -12
  253. intentkit/skills/unrealspeech/__init__.py +2 -7
  254. intentkit/skills/unrealspeech/base.py +2 -8
  255. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  256. intentkit/skills/venice_audio/__init__.py +98 -106
  257. intentkit/skills/venice_audio/base.py +117 -121
  258. intentkit/skills/venice_audio/input.py +41 -41
  259. intentkit/skills/venice_audio/venice_audio.py +7 -11
  260. intentkit/skills/venice_image/__init__.py +147 -154
  261. intentkit/skills/venice_image/api.py +138 -138
  262. intentkit/skills/venice_image/base.py +185 -192
  263. intentkit/skills/venice_image/config.py +33 -35
  264. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  265. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  266. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  267. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  268. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  269. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  270. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  271. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  272. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  273. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  274. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  275. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  276. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  277. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  278. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  279. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  280. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  281. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  282. intentkit/skills/venice_image/utils.py +77 -78
  283. intentkit/skills/web_scraper/__init__.py +5 -18
  284. intentkit/skills/web_scraper/base.py +21 -7
  285. intentkit/skills/web_scraper/document_indexer.py +7 -6
  286. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  287. intentkit/skills/web_scraper/utils.py +62 -63
  288. intentkit/skills/web_scraper/website_indexer.py +17 -19
  289. intentkit/skills/weth/__init__.py +5 -11
  290. intentkit/skills/wow/__init__.py +5 -11
  291. intentkit/skills/x402/__init__.py +61 -0
  292. intentkit/skills/x402/ask_agent.py +98 -0
  293. intentkit/skills/x402/base.py +99 -0
  294. intentkit/skills/x402/http_request.py +117 -0
  295. intentkit/skills/x402/schema.json +45 -0
  296. intentkit/skills/x402/x402.webp +0 -0
  297. intentkit/skills/xmtp/__init__.py +4 -15
  298. intentkit/skills/xmtp/base.py +5 -5
  299. intentkit/skills/xmtp/price.py +6 -6
  300. intentkit/skills/xmtp/swap.py +6 -8
  301. intentkit/skills/xmtp/transfer.py +4 -6
  302. intentkit/utils/error.py +2 -2
  303. intentkit/utils/logging.py +2 -4
  304. intentkit/utils/s3.py +8 -9
  305. intentkit/utils/schema.py +100 -0
  306. intentkit/utils/slack_alert.py +7 -8
  307. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
  308. intentkit-0.8.17.dist-info/RECORD +466 -0
  309. intentkit/models/generator.py +0 -347
  310. intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
  311. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  312. {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
@@ -1,8 +1,8 @@
1
1
  import logging
2
2
  import os
3
3
  import tempfile
4
- from datetime import datetime, timedelta, timezone
5
- from typing import Any, Dict, List, NotRequired, Optional, TypedDict
4
+ from datetime import UTC, datetime, timedelta
5
+ from typing import Any, NotRequired, TypedDict
6
6
  from urllib.parse import urlencode
7
7
 
8
8
  import httpx
@@ -11,15 +11,14 @@ from requests.auth import HTTPBasicAuth
11
11
  from requests_oauthlib import OAuth2Session
12
12
  from tweepy.asynchronous import AsyncClient
13
13
 
14
- from intentkit.abstracts.skill import SkillStoreABC
15
14
  from intentkit.abstracts.twitter import TwitterABC
16
15
  from intentkit.models.agent_data import AgentData
17
16
  from intentkit.models.redis import get_redis
18
17
 
19
18
  logger = logging.getLogger(__name__)
20
19
 
21
- _clients_linked: Dict[str, "TwitterClient"] = {}
22
- _clients_self_key: Dict[str, "TwitterClient"] = {}
20
+ _clients_linked: dict[str, "TwitterClient"] = {}
21
+ _clients_self_key: dict[str, "TwitterClient"] = {}
23
22
 
24
23
  _VERIFIER_KEY = "intentkit:twitter:code_verifier"
25
24
  _CHALLENGE_KEY = "intentkit:twitter:code_challenge"
@@ -30,7 +29,7 @@ class TwitterMedia(BaseModel):
30
29
 
31
30
  media_key: str
32
31
  type: str
33
- url: Optional[str] = None
32
+ url: str | None = None
34
33
 
35
34
 
36
35
  class TwitterUser(BaseModel):
@@ -59,10 +58,10 @@ class Tweet(BaseModel):
59
58
  id: str
60
59
  text: str
61
60
  author_id: str
62
- author: Optional[TwitterUser] = None
61
+ author: TwitterUser | None = None
63
62
  created_at: datetime
64
- referenced_tweets: Optional[List["Tweet"]] = None
65
- attachments: Optional[List[TwitterMedia]] = None
63
+ referenced_tweets: list["Tweet"] | None = None
64
+ attachments: list[TwitterMedia] | None = None
66
65
 
67
66
 
68
67
  class TwitterClientConfig(TypedDict):
@@ -80,33 +79,44 @@ class TwitterClient(TwitterABC):
80
79
 
81
80
  Args:
82
81
  agent_id: The ID of the agent
83
- skill_store: The skill store for retrieving data
84
82
  config: Configuration dictionary that may contain API keys
85
83
  """
86
84
 
87
- def __init__(self, agent_id: str, skill_store: SkillStoreABC, config: Dict) -> None:
85
+ def __init__(self, agent_id: str, config: dict) -> None:
88
86
  """Initialize the Twitter client.
89
87
 
90
88
  Args:
91
89
  agent_id: The ID of the agent
92
- skill_store: The skill store for retrieving data
93
90
  config: Configuration dictionary that may contain API keys
94
91
  """
95
92
  self.agent_id = agent_id
96
- self._client: Optional[AsyncClient] = None
97
- self._skill_store = skill_store
98
- self._agent_data: Optional[AgentData] = None
93
+ self._client: AsyncClient | None = None
94
+ self._agent_data: AgentData | None = None
99
95
  self.use_key = _is_self_key(config)
100
96
  self._config = config
101
97
 
98
+ async def _get_agent_data(self) -> AgentData:
99
+ """Retrieve cached agent data, loading from the database if needed."""
100
+
101
+ if not self._agent_data:
102
+ self._agent_data = await AgentData.get(self.agent_id)
103
+ return self._agent_data
104
+
105
+ async def _refresh_agent_data(self) -> AgentData:
106
+ """Reload agent data from the database."""
107
+
108
+ self._agent_data = await AgentData.get(self.agent_id)
109
+ return self._agent_data
110
+
102
111
  async def get_client(self) -> AsyncClient:
103
112
  """Get the initialized Twitter client.
104
113
 
105
114
  Returns:
106
115
  AsyncClient: The Twitter client if initialized
107
116
  """
108
- if not self._agent_data:
109
- self._agent_data = await self._skill_store.get_agent_data(self.agent_id)
117
+
118
+ agent_data = await self._get_agent_data()
119
+
110
120
  if not self._client:
111
121
  # Check if we have API keys in config
112
122
  if self.use_key:
@@ -118,30 +128,26 @@ class TwitterClient(TwitterABC):
118
128
  return_type=dict,
119
129
  )
120
130
  # refresh userinfo if needed
121
- if not self._agent_data.twitter_self_key_refreshed_at or (
122
- self._agent_data.twitter_self_key_refreshed_at
123
- < datetime.now(tz=timezone.utc) - timedelta(days=1)
131
+ if not agent_data.twitter_self_key_refreshed_at or (
132
+ agent_data.twitter_self_key_refreshed_at
133
+ < datetime.now(tz=UTC) - timedelta(days=1)
124
134
  ):
125
135
  me = await self._client.get_me(
126
136
  user_auth=self.use_key,
127
137
  user_fields="id,username,name,verified",
128
138
  )
129
139
  if me and "data" in me and "id" in me["data"]:
130
- await self._skill_store.set_agent_data(
140
+ await AgentData.patch(
131
141
  self.agent_id,
132
142
  {
133
143
  "twitter_id": me["data"]["id"],
134
144
  "twitter_username": me["data"]["username"],
135
145
  "twitter_name": me["data"]["name"],
136
146
  "twitter_is_verified": me["data"]["verified"],
137
- "twitter_self_key_refreshed_at": datetime.now(
138
- tz=timezone.utc
139
- ),
147
+ "twitter_self_key_refreshed_at": datetime.now(tz=UTC),
140
148
  },
141
149
  )
142
- self._agent_data = await self._skill_store.get_agent_data(
143
- self.agent_id
144
- )
150
+ agent_data = await self._refresh_agent_data()
145
151
  logger.info(
146
152
  f"Twitter self key client initialized. "
147
153
  f"Use API key: {self.use_key}, "
@@ -152,43 +158,38 @@ class TwitterClient(TwitterABC):
152
158
  )
153
159
  return self._client
154
160
  # Otherwise try to get OAuth2 tokens from agent data
155
- if not self._agent_data.twitter_access_token:
161
+ if not agent_data.twitter_access_token:
156
162
  raise Exception(f"[{self.agent_id}] Twitter access token not found")
157
- if not self._agent_data.twitter_access_token_expires_at:
163
+ if not agent_data.twitter_access_token_expires_at:
158
164
  raise Exception(
159
165
  f"[{self.agent_id}] Twitter access token expiration not found"
160
166
  )
161
- if self._agent_data.twitter_access_token_expires_at <= datetime.now(
162
- tz=timezone.utc
163
- ):
167
+ if agent_data.twitter_access_token_expires_at <= datetime.now(tz=UTC):
164
168
  raise Exception(f"[{self.agent_id}] Twitter access token has expired")
165
169
  self._client = AsyncClient(
166
- bearer_token=self._agent_data.twitter_access_token,
170
+ bearer_token=agent_data.twitter_access_token,
167
171
  return_type=dict,
168
172
  )
169
173
  return self._client
174
+
170
175
  if not self.use_key:
171
176
  # check if access token has expired
172
- if self._agent_data.twitter_access_token_expires_at <= datetime.now(
173
- tz=timezone.utc
174
- ):
175
- self._agent_data = await self._skill_store.get_agent_data(self.agent_id)
176
- # check again
177
- if self._agent_data.twitter_access_token_expires_at <= datetime.now(
178
- tz=timezone.utc
179
- ):
177
+ if agent_data.twitter_access_token_expires_at <= datetime.now(tz=UTC):
178
+ agent_data = await self._refresh_agent_data()
179
+ if agent_data.twitter_access_token_expires_at <= datetime.now(tz=UTC):
180
180
  raise Exception(
181
181
  f"[{self.agent_id}] Twitter access token has expired"
182
182
  )
183
183
  self._client = AsyncClient(
184
- bearer_token=self._agent_data.twitter_access_token,
184
+ bearer_token=agent_data.twitter_access_token,
185
185
  return_type=dict,
186
186
  )
187
187
  return self._client
188
+
188
189
  return self._client
189
190
 
190
191
  @property
191
- def self_id(self) -> Optional[str]:
192
+ def self_id(self) -> str | None:
192
193
  """Get the Twitter user ID.
193
194
 
194
195
  Returns:
@@ -201,7 +202,7 @@ class TwitterClient(TwitterABC):
201
202
  return self._agent_data.twitter_id
202
203
 
203
204
  @property
204
- def self_username(self) -> Optional[str]:
205
+ def self_username(self) -> str | None:
205
206
  """Get the Twitter username.
206
207
 
207
208
  Returns:
@@ -214,7 +215,7 @@ class TwitterClient(TwitterABC):
214
215
  return self._agent_data.twitter_username
215
216
 
216
217
  @property
217
- def self_name(self) -> Optional[str]:
218
+ def self_name(self) -> str | None:
218
219
  """Get the Twitter display name.
219
220
 
220
221
  Returns:
@@ -227,7 +228,7 @@ class TwitterClient(TwitterABC):
227
228
  return self._agent_data.twitter_name
228
229
 
229
230
  @property
230
- def self_is_verified(self) -> Optional[bool]:
231
+ def self_is_verified(self) -> bool | None:
231
232
  """Get the Twitter account verification status.
232
233
 
233
234
  Returns:
@@ -239,14 +240,14 @@ class TwitterClient(TwitterABC):
239
240
  return None
240
241
  return self._agent_data.twitter_is_verified
241
242
 
242
- def process_tweets_response(self, response: Dict[str, Any]) -> List[Tweet]:
243
+ def process_tweets_response(self, response: dict[str, Any]) -> list[Tweet]:
243
244
  """Process Twitter API response and convert it to a list of Tweet objects.
244
245
 
245
246
  Args:
246
247
  response: Raw Twitter API response containing tweets data and includes.
247
248
 
248
249
  Returns:
249
- List[Tweet]: List of processed Tweet objects.
250
+ list[Tweet]: List of processed Tweet objects.
250
251
  """
251
252
  result = []
252
253
  if not response.get("data"):
@@ -338,7 +339,7 @@ class TwitterClient(TwitterABC):
338
339
 
339
340
  return result
340
341
 
341
- async def upload_media(self, agent_id: str, image_url: str) -> List[str]:
342
+ async def upload_media(self, agent_id: str, image_url: str) -> list[str]:
342
343
  """Upload media to Twitter and return the media IDs.
343
344
 
344
345
  Args:
@@ -346,13 +347,13 @@ class TwitterClient(TwitterABC):
346
347
  image_url: The URL of the image to upload.
347
348
 
348
349
  Returns:
349
- List[str]: A list of media IDs for the uploaded media.
350
+ list[str]: A list of media IDs for the uploaded media.
350
351
 
351
352
  Raises:
352
353
  ValueError: If there's an error uploading the media.
353
354
  """
354
355
  # Get agent data to access the token
355
- agent_data = await self._skill_store.get_agent_data(agent_id)
356
+ agent_data = await AgentData.get(agent_id)
356
357
  if not agent_data.twitter_access_token:
357
358
  raise ValueError("Only linked X account can post media")
358
359
 
@@ -419,19 +420,17 @@ class TwitterClient(TwitterABC):
419
420
  return media_ids
420
421
 
421
422
 
422
- def _is_self_key(config: Dict) -> bool:
423
+ def _is_self_key(config: dict) -> bool:
423
424
  return config.get("api_key_provider") == "agent_owner"
424
425
 
425
426
 
426
- def get_twitter_client(
427
- agent_id: str, skill_store: SkillStoreABC, config: Dict
428
- ) -> "TwitterClient":
427
+ def get_twitter_client(agent_id: str, config: dict) -> "TwitterClient":
429
428
  if _is_self_key(config):
430
429
  if agent_id not in _clients_self_key:
431
- _clients_self_key[agent_id] = TwitterClient(agent_id, skill_store, config)
430
+ _clients_self_key[agent_id] = TwitterClient(agent_id, config)
432
431
  return _clients_self_key[agent_id]
433
432
  if agent_id not in _clients_linked:
434
- _clients_linked[agent_id] = TwitterClient(agent_id, skill_store, config)
433
+ _clients_linked[agent_id] = TwitterClient(agent_id, config)
435
434
  return _clients_linked[agent_id]
436
435
 
437
436
 
intentkit/clients/web3.py CHANGED
@@ -1,12 +1,10 @@
1
- from typing import Dict
2
-
3
1
  from web3 import Web3
4
2
 
5
3
  from intentkit.config.config import config
6
4
  from intentkit.utils.chain import ChainProvider
7
5
 
8
6
  # Global cache for Web3 clients by network_id
9
- _web3_client_cache: Dict[str, Web3] = {}
7
+ _web3_client_cache: dict[str, Web3] = {}
10
8
 
11
9
 
12
10
  def get_web3_client(network_id: str) -> Web3:
@@ -79,6 +79,7 @@ class Config:
79
79
  self.debug_password = self.load("DEBUG_PASSWORD")
80
80
  # Payment
81
81
  self.payment_enabled = self.load("PAYMENT_ENABLED", "false") == "true"
82
+ self.x402_fee_address = self.load("X402_FEE_ADDRESS")
82
83
  # Open API for agent
83
84
  self.open_api_base_url = self.load("OPEN_API_BASE_URL", "http://localhost:8000")
84
85
  # CDP - AgentKit 0.7.x Configuration
@@ -108,6 +109,10 @@ class Config:
108
109
  self.tg_server_host = self.load("TG_SERVER_HOST", "127.0.0.1")
109
110
  self.tg_server_port = self.load("TG_SERVER_PORT", "8081")
110
111
  self.tg_new_agent_poll_interval = self.load("TG_NEW_AGENT_POLL_INTERVAL", "60")
112
+ # Discord server settings
113
+ self.discord_new_agent_poll_interval = self.load(
114
+ "DISCORD_NEW_AGENT_POLL_INTERVAL", "30"
115
+ )
111
116
  # Twitter
112
117
  self.twitter_oauth2_client_id = self.load("TWITTER_OAUTH2_CLIENT_ID")
113
118
  self.twitter_oauth2_client_secret = self.load("TWITTER_OAUTH2_CLIENT_SECRET")