intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__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.
Files changed (393) hide show
  1. intentkit/MANIFEST.in +14 -0
  2. intentkit/README.md +88 -0
  3. intentkit/__init__.py +6 -4
  4. intentkit/abstracts/agent.py +4 -5
  5. intentkit/abstracts/engine.py +5 -5
  6. intentkit/abstracts/graph.py +15 -8
  7. intentkit/abstracts/skill.py +6 -144
  8. intentkit/abstracts/twitter.py +4 -5
  9. intentkit/clients/__init__.py +9 -2
  10. intentkit/clients/cdp.py +129 -153
  11. intentkit/{utils → clients}/s3.py +109 -34
  12. intentkit/clients/twitter.py +83 -62
  13. intentkit/clients/web3.py +4 -7
  14. intentkit/config/config.py +123 -90
  15. intentkit/core/account_checking.py +802 -0
  16. intentkit/core/agent.py +313 -498
  17. intentkit/core/asset.py +267 -0
  18. intentkit/core/chat.py +5 -3
  19. intentkit/core/client.py +1 -1
  20. intentkit/core/credit.py +49 -41
  21. intentkit/core/draft.py +201 -0
  22. intentkit/core/draft_chat.py +118 -0
  23. intentkit/core/engine.py +378 -287
  24. intentkit/core/manager/__init__.py +25 -0
  25. intentkit/core/manager/engine.py +220 -0
  26. intentkit/core/manager/service.py +172 -0
  27. intentkit/core/manager/skills.py +178 -0
  28. intentkit/core/middleware.py +231 -0
  29. intentkit/core/prompt.py +74 -114
  30. intentkit/core/scheduler.py +143 -0
  31. intentkit/core/statistics.py +168 -0
  32. intentkit/models/agent.py +931 -518
  33. intentkit/models/agent_data.py +165 -106
  34. intentkit/models/agent_schema.json +38 -251
  35. intentkit/models/app_setting.py +15 -13
  36. intentkit/models/chat.py +86 -140
  37. intentkit/models/credit.py +182 -162
  38. intentkit/models/db.py +42 -23
  39. intentkit/models/db_mig.py +120 -3
  40. intentkit/models/draft.py +222 -0
  41. intentkit/models/llm.csv +31 -0
  42. intentkit/models/llm.py +262 -370
  43. intentkit/models/redis.py +6 -4
  44. intentkit/models/skill.py +222 -101
  45. intentkit/models/skills.csv +173 -0
  46. intentkit/models/team.py +189 -0
  47. intentkit/models/user.py +103 -31
  48. intentkit/skills/acolyt/__init__.py +2 -9
  49. intentkit/skills/acolyt/ask.py +3 -4
  50. intentkit/skills/acolyt/base.py +4 -9
  51. intentkit/skills/acolyt/schema.json +4 -3
  52. intentkit/skills/aixbt/__init__.py +2 -13
  53. intentkit/skills/aixbt/base.py +1 -7
  54. intentkit/skills/aixbt/projects.py +14 -15
  55. intentkit/skills/aixbt/schema.json +4 -4
  56. intentkit/skills/allora/__init__.py +2 -9
  57. intentkit/skills/allora/base.py +4 -9
  58. intentkit/skills/allora/price.py +3 -4
  59. intentkit/skills/allora/schema.json +3 -2
  60. intentkit/skills/base.py +241 -41
  61. intentkit/skills/basename/__init__.py +51 -0
  62. intentkit/skills/basename/base.py +11 -0
  63. intentkit/skills/basename/basename.svg +11 -0
  64. intentkit/skills/basename/schema.json +58 -0
  65. intentkit/skills/carv/__init__.py +115 -121
  66. intentkit/skills/carv/base.py +184 -185
  67. intentkit/skills/carv/fetch_news.py +3 -3
  68. intentkit/skills/carv/onchain_query.py +4 -4
  69. intentkit/skills/carv/schema.json +134 -137
  70. intentkit/skills/carv/token_info_and_price.py +6 -6
  71. intentkit/skills/casino/__init__.py +4 -15
  72. intentkit/skills/casino/base.py +1 -7
  73. intentkit/skills/casino/deck_draw.py +5 -8
  74. intentkit/skills/casino/deck_shuffle.py +6 -6
  75. intentkit/skills/casino/dice_roll.py +2 -4
  76. intentkit/skills/casino/schema.json +0 -1
  77. intentkit/skills/cdp/__init__.py +22 -84
  78. intentkit/skills/cdp/base.py +1 -7
  79. intentkit/skills/cdp/schema.json +11 -314
  80. intentkit/skills/chainlist/__init__.py +2 -7
  81. intentkit/skills/chainlist/base.py +1 -7
  82. intentkit/skills/chainlist/chain_lookup.py +18 -18
  83. intentkit/skills/chainlist/schema.json +3 -5
  84. intentkit/skills/common/__init__.py +2 -9
  85. intentkit/skills/common/base.py +1 -7
  86. intentkit/skills/common/current_time.py +1 -2
  87. intentkit/skills/common/schema.json +2 -2
  88. intentkit/skills/cookiefun/__init__.py +6 -9
  89. intentkit/skills/cookiefun/base.py +2 -7
  90. intentkit/skills/cookiefun/get_account_details.py +7 -7
  91. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  92. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  93. intentkit/skills/cookiefun/get_sectors.py +3 -3
  94. intentkit/skills/cookiefun/schema.json +1 -3
  95. intentkit/skills/cookiefun/search_accounts.py +9 -9
  96. intentkit/skills/cryptocompare/__init__.py +7 -24
  97. intentkit/skills/cryptocompare/api.py +2 -3
  98. intentkit/skills/cryptocompare/base.py +10 -24
  99. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  100. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  101. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  102. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  103. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  104. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  105. intentkit/skills/cryptocompare/schema.json +3 -3
  106. intentkit/skills/cryptopanic/__init__.py +7 -10
  107. intentkit/skills/cryptopanic/base.py +51 -55
  108. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  109. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  110. intentkit/skills/cryptopanic/schema.json +105 -103
  111. intentkit/skills/dapplooker/__init__.py +2 -9
  112. intentkit/skills/dapplooker/base.py +4 -9
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  114. intentkit/skills/dapplooker/schema.json +3 -5
  115. intentkit/skills/defillama/__init__.py +24 -74
  116. intentkit/skills/defillama/api.py +6 -9
  117. intentkit/skills/defillama/base.py +8 -19
  118. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  119. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  120. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  121. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  122. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  123. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  124. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  125. intentkit/skills/defillama/config/chains.py +1 -3
  126. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  127. intentkit/skills/defillama/schema.json +5 -1
  128. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  129. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  130. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  131. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  132. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  133. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  134. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  135. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  136. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  137. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  138. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  139. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  140. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  141. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  142. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  143. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  144. intentkit/skills/dexscreener/__init__.py +97 -102
  145. intentkit/skills/dexscreener/base.py +125 -130
  146. intentkit/skills/dexscreener/get_pair_info.py +4 -5
  147. intentkit/skills/dexscreener/get_token_pairs.py +4 -5
  148. intentkit/skills/dexscreener/get_tokens_info.py +7 -8
  149. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  150. intentkit/skills/dexscreener/schema.json +91 -93
  151. intentkit/skills/dexscreener/search_token.py +182 -184
  152. intentkit/skills/dexscreener/utils.py +15 -14
  153. intentkit/skills/dune_analytics/__init__.py +7 -9
  154. intentkit/skills/dune_analytics/base.py +48 -52
  155. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  156. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  157. intentkit/skills/dune_analytics/schema.json +104 -99
  158. intentkit/skills/elfa/__init__.py +5 -18
  159. intentkit/skills/elfa/base.py +10 -14
  160. intentkit/skills/elfa/mention.py +19 -21
  161. intentkit/skills/elfa/schema.json +3 -2
  162. intentkit/skills/elfa/stats.py +4 -4
  163. intentkit/skills/elfa/tokens.py +12 -12
  164. intentkit/skills/elfa/utils.py +26 -28
  165. intentkit/skills/enso/__init__.py +11 -31
  166. intentkit/skills/enso/base.py +54 -35
  167. intentkit/skills/enso/best_yield.py +16 -24
  168. intentkit/skills/enso/networks.py +6 -11
  169. intentkit/skills/enso/prices.py +11 -13
  170. intentkit/skills/enso/route.py +34 -38
  171. intentkit/skills/enso/schema.json +3 -2
  172. intentkit/skills/enso/tokens.py +29 -38
  173. intentkit/skills/enso/wallet.py +76 -191
  174. intentkit/skills/erc20/__init__.py +50 -0
  175. intentkit/skills/erc20/base.py +11 -0
  176. intentkit/skills/erc20/erc20.svg +5 -0
  177. intentkit/skills/erc20/schema.json +74 -0
  178. intentkit/skills/erc721/__init__.py +53 -0
  179. intentkit/skills/erc721/base.py +11 -0
  180. intentkit/skills/erc721/erc721.svg +5 -0
  181. intentkit/skills/erc721/schema.json +90 -0
  182. intentkit/skills/firecrawl/__init__.py +5 -18
  183. intentkit/skills/firecrawl/base.py +4 -9
  184. intentkit/skills/firecrawl/clear.py +4 -8
  185. intentkit/skills/firecrawl/crawl.py +19 -19
  186. intentkit/skills/firecrawl/query.py +4 -3
  187. intentkit/skills/firecrawl/schema.json +2 -6
  188. intentkit/skills/firecrawl/scrape.py +17 -22
  189. intentkit/skills/firecrawl/utils.py +50 -42
  190. intentkit/skills/github/__init__.py +2 -7
  191. intentkit/skills/github/base.py +1 -7
  192. intentkit/skills/github/github_search.py +1 -2
  193. intentkit/skills/github/schema.json +3 -4
  194. intentkit/skills/heurist/__init__.py +8 -27
  195. intentkit/skills/heurist/base.py +4 -9
  196. intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
  197. intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
  198. intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
  199. intentkit/skills/heurist/image_generation_braindance.py +13 -15
  200. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
  201. intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
  202. intentkit/skills/heurist/image_generation_sdxl.py +13 -15
  203. intentkit/skills/heurist/schema.json +2 -2
  204. intentkit/skills/http/__init__.py +4 -15
  205. intentkit/skills/http/base.py +1 -7
  206. intentkit/skills/http/get.py +21 -16
  207. intentkit/skills/http/post.py +23 -18
  208. intentkit/skills/http/put.py +23 -18
  209. intentkit/skills/http/schema.json +4 -5
  210. intentkit/skills/lifi/__init__.py +8 -13
  211. intentkit/skills/lifi/base.py +3 -9
  212. intentkit/skills/lifi/schema.json +17 -8
  213. intentkit/skills/lifi/token_execute.py +150 -60
  214. intentkit/skills/lifi/token_quote.py +8 -10
  215. intentkit/skills/lifi/utils.py +104 -51
  216. intentkit/skills/moralis/__init__.py +6 -10
  217. intentkit/skills/moralis/api.py +6 -7
  218. intentkit/skills/moralis/base.py +5 -10
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  223. intentkit/skills/moralis/schema.json +7 -2
  224. intentkit/skills/morpho/__init__.py +52 -0
  225. intentkit/skills/morpho/base.py +11 -0
  226. intentkit/skills/morpho/morpho.svg +12 -0
  227. intentkit/skills/morpho/schema.json +73 -0
  228. intentkit/skills/nation/__init__.py +4 -9
  229. intentkit/skills/nation/base.py +5 -10
  230. intentkit/skills/nation/nft_check.py +3 -4
  231. intentkit/skills/nation/schema.json +4 -3
  232. intentkit/skills/onchain.py +30 -0
  233. intentkit/skills/openai/__init__.py +17 -18
  234. intentkit/skills/openai/base.py +10 -14
  235. intentkit/skills/openai/dalle_image_generation.py +4 -9
  236. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  237. intentkit/skills/openai/gpt_image_generation.py +5 -9
  238. intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
  239. intentkit/skills/openai/gpt_image_to_image.py +5 -9
  240. intentkit/skills/openai/image_to_text.py +3 -7
  241. intentkit/skills/openai/schema.json +34 -3
  242. intentkit/skills/portfolio/__init__.py +11 -35
  243. intentkit/skills/portfolio/base.py +33 -19
  244. intentkit/skills/portfolio/schema.json +3 -5
  245. intentkit/skills/portfolio/token_balances.py +21 -21
  246. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  247. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  248. intentkit/skills/portfolio/wallet_history.py +31 -31
  249. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  250. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  251. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  252. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  253. intentkit/skills/portfolio/wallet_stats.py +3 -3
  254. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  255. intentkit/skills/pyth/__init__.py +50 -0
  256. intentkit/skills/pyth/base.py +11 -0
  257. intentkit/skills/pyth/pyth.svg +6 -0
  258. intentkit/skills/pyth/schema.json +75 -0
  259. intentkit/skills/skills.toml +36 -0
  260. intentkit/skills/slack/__init__.py +5 -17
  261. intentkit/skills/slack/base.py +3 -9
  262. intentkit/skills/slack/get_channel.py +8 -8
  263. intentkit/skills/slack/get_message.py +9 -9
  264. intentkit/skills/slack/schedule_message.py +5 -5
  265. intentkit/skills/slack/schema.json +2 -2
  266. intentkit/skills/slack/send_message.py +3 -5
  267. intentkit/skills/supabase/__init__.py +7 -23
  268. intentkit/skills/supabase/base.py +1 -7
  269. intentkit/skills/supabase/delete_data.py +4 -4
  270. intentkit/skills/supabase/fetch_data.py +12 -12
  271. intentkit/skills/supabase/insert_data.py +4 -4
  272. intentkit/skills/supabase/invoke_function.py +6 -6
  273. intentkit/skills/supabase/schema.json +2 -3
  274. intentkit/skills/supabase/update_data.py +6 -6
  275. intentkit/skills/supabase/upsert_data.py +4 -4
  276. intentkit/skills/superfluid/__init__.py +53 -0
  277. intentkit/skills/superfluid/base.py +11 -0
  278. intentkit/skills/superfluid/schema.json +89 -0
  279. intentkit/skills/superfluid/superfluid.svg +6 -0
  280. intentkit/skills/system/__init__.py +7 -24
  281. intentkit/skills/system/add_autonomous_task.py +10 -12
  282. intentkit/skills/system/delete_autonomous_task.py +2 -2
  283. intentkit/skills/system/edit_autonomous_task.py +14 -18
  284. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  285. intentkit/skills/system/read_agent_api_key.py +6 -4
  286. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  287. intentkit/skills/system/schema.json +6 -8
  288. intentkit/skills/tavily/__init__.py +3 -12
  289. intentkit/skills/tavily/base.py +4 -9
  290. intentkit/skills/tavily/schema.json +3 -5
  291. intentkit/skills/tavily/tavily_extract.py +2 -4
  292. intentkit/skills/tavily/tavily_search.py +4 -6
  293. intentkit/skills/token/__init__.py +5 -10
  294. intentkit/skills/token/base.py +7 -11
  295. intentkit/skills/token/erc20_transfers.py +19 -19
  296. intentkit/skills/token/schema.json +3 -6
  297. intentkit/skills/token/token_analytics.py +3 -3
  298. intentkit/skills/token/token_price.py +13 -13
  299. intentkit/skills/token/token_search.py +9 -9
  300. intentkit/skills/twitter/__init__.py +11 -35
  301. intentkit/skills/twitter/base.py +22 -34
  302. intentkit/skills/twitter/follow_user.py +2 -6
  303. intentkit/skills/twitter/get_mentions.py +5 -12
  304. intentkit/skills/twitter/get_timeline.py +4 -12
  305. intentkit/skills/twitter/get_user_by_username.py +2 -6
  306. intentkit/skills/twitter/get_user_tweets.py +5 -13
  307. intentkit/skills/twitter/like_tweet.py +2 -6
  308. intentkit/skills/twitter/post_tweet.py +6 -9
  309. intentkit/skills/twitter/reply_tweet.py +6 -9
  310. intentkit/skills/twitter/retweet.py +2 -6
  311. intentkit/skills/twitter/schema.json +1 -0
  312. intentkit/skills/twitter/search_tweets.py +4 -12
  313. intentkit/skills/unrealspeech/__init__.py +2 -7
  314. intentkit/skills/unrealspeech/base.py +2 -8
  315. intentkit/skills/unrealspeech/schema.json +2 -5
  316. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  317. intentkit/skills/venice_audio/__init__.py +98 -106
  318. intentkit/skills/venice_audio/base.py +117 -121
  319. intentkit/skills/venice_audio/input.py +41 -41
  320. intentkit/skills/venice_audio/schema.json +151 -152
  321. intentkit/skills/venice_audio/venice_audio.py +38 -21
  322. intentkit/skills/venice_image/__init__.py +147 -154
  323. intentkit/skills/venice_image/api.py +138 -138
  324. intentkit/skills/venice_image/base.py +185 -192
  325. intentkit/skills/venice_image/config.py +33 -35
  326. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  327. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  328. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  329. intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
  330. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  332. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  333. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  334. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  335. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  336. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  337. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  338. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  339. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  340. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  341. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  344. intentkit/skills/venice_image/schema.json +267 -267
  345. intentkit/skills/venice_image/utils.py +77 -78
  346. intentkit/skills/web_scraper/__init__.py +5 -18
  347. intentkit/skills/web_scraper/base.py +21 -7
  348. intentkit/skills/web_scraper/document_indexer.py +7 -6
  349. intentkit/skills/web_scraper/schema.json +2 -6
  350. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  351. intentkit/skills/web_scraper/utils.py +62 -63
  352. intentkit/skills/web_scraper/website_indexer.py +17 -19
  353. intentkit/skills/weth/__init__.py +49 -0
  354. intentkit/skills/weth/base.py +11 -0
  355. intentkit/skills/weth/schema.json +58 -0
  356. intentkit/skills/weth/weth.svg +6 -0
  357. intentkit/skills/wow/__init__.py +51 -0
  358. intentkit/skills/wow/base.py +11 -0
  359. intentkit/skills/wow/schema.json +89 -0
  360. intentkit/skills/wow/wow.svg +7 -0
  361. intentkit/skills/x402/__init__.py +58 -0
  362. intentkit/skills/x402/base.py +99 -0
  363. intentkit/skills/x402/http_request.py +117 -0
  364. intentkit/skills/x402/schema.json +40 -0
  365. intentkit/skills/x402/x402.webp +0 -0
  366. intentkit/skills/xmtp/__init__.py +4 -15
  367. intentkit/skills/xmtp/base.py +5 -5
  368. intentkit/skills/xmtp/price.py +7 -6
  369. intentkit/skills/xmtp/schema.json +69 -71
  370. intentkit/skills/xmtp/swap.py +6 -8
  371. intentkit/skills/xmtp/transfer.py +4 -6
  372. intentkit/utils/__init__.py +4 -0
  373. intentkit/utils/chain.py +198 -96
  374. intentkit/utils/ens.py +135 -0
  375. intentkit/utils/error.py +5 -2
  376. intentkit/utils/logging.py +9 -11
  377. intentkit/utils/schema.py +100 -0
  378. intentkit/utils/slack_alert.py +8 -8
  379. intentkit/utils/tx.py +16 -8
  380. intentkit/uv.lock +3377 -0
  381. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
  382. intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
  383. intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
  384. intentkit/core/node.py +0 -215
  385. intentkit/models/conversation.py +0 -286
  386. intentkit/models/generator.py +0 -347
  387. intentkit/skills/cdp/get_balance.py +0 -110
  388. intentkit/skills/cdp/swap.py +0 -121
  389. intentkit/skills/moralis/tests/__init__.py +0 -0
  390. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  391. intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
  392. {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
  393. {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Dict, List, Optional, Type
2
+ from typing import Any
3
3
 
4
4
  from pydantic import BaseModel, Field
5
5
 
@@ -14,15 +14,15 @@ class TokenSearchInput(BaseModel):
14
14
  query: str = Field(
15
15
  description="Search query - can be token address, token name or token symbol."
16
16
  )
17
- chains: Optional[List[str]] = Field(
17
+ chains: list[str] | None = Field(
18
18
  description="The chain(s) to query (e.g., 'eth', 'bsc', 'polygon').",
19
19
  default=None,
20
20
  )
21
- limit: Optional[int] = Field(
21
+ limit: int | None = Field(
22
22
  description="The desired page size of the result.",
23
23
  default=None,
24
24
  )
25
- is_verified_contract: Optional[bool] = Field(
25
+ is_verified_contract: bool | None = Field(
26
26
  description="Whether the contract is verified.",
27
27
  default=None,
28
28
  )
@@ -44,16 +44,16 @@ class TokenSearch(TokenBaseTool):
44
44
  "Returns token information including price, market cap, and security information. "
45
45
  "NOTE: This is a premium endpoint that requires a Moralis Business plan."
46
46
  )
47
- args_schema: Type[BaseModel] = TokenSearchInput
47
+ args_schema: type[BaseModel] = TokenSearchInput
48
48
 
49
49
  async def _arun(
50
50
  self,
51
51
  query: str,
52
- chains: Optional[List[str]] = None,
53
- limit: Optional[int] = None,
54
- is_verified_contract: Optional[bool] = None,
52
+ chains: list[str] | None = None,
53
+ limit: int | None = None,
54
+ is_verified_contract: bool | None = None,
55
55
  **kwargs,
56
- ) -> Dict[str, Any]:
56
+ ) -> dict[str, Any]:
57
57
  """Search for tokens using Moralis.
58
58
 
59
59
  Args:
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.clients import TwitterClientConfig
8
7
  from intentkit.skills.base import SkillConfig, SkillState
9
8
  from intentkit.skills.twitter.base import TwitterBaseTool
@@ -46,7 +45,6 @@ class Config(SkillConfig, TwitterClientConfig):
46
45
  async def get_skills(
47
46
  config: "Config",
48
47
  is_private: bool,
49
- store: SkillStoreABC,
50
48
  **_,
51
49
  ) -> list[TwitterBaseTool]:
52
50
  """Get all Twitter skills."""
@@ -62,7 +60,7 @@ async def get_skills(
62
60
  # Get each skill using the cached getter
63
61
  result = []
64
62
  for name in available_skills:
65
- skill = get_twitter_skill(name, store)
63
+ skill = get_twitter_skill(name)
66
64
  if skill:
67
65
  result.append(skill)
68
66
  return result
@@ -70,76 +68,54 @@ async def get_skills(
70
68
 
71
69
  def get_twitter_skill(
72
70
  name: str,
73
- store: SkillStoreABC,
74
71
  ) -> TwitterBaseTool:
75
72
  """Get a Twitter skill by name.
76
73
 
77
74
  Args:
78
75
  name: The name of the skill to get
79
- store: The skill store for persisting data
80
76
 
81
77
  Returns:
82
78
  The requested Twitter skill
83
79
  """
84
80
  if name == "get_mentions":
85
81
  if name not in _cache:
86
- _cache[name] = TwitterGetMentions(
87
- skill_store=store,
88
- )
82
+ _cache[name] = TwitterGetMentions()
89
83
  return _cache[name]
90
84
  elif name == "post_tweet":
91
85
  if name not in _cache:
92
- _cache[name] = TwitterPostTweet(
93
- skill_store=store,
94
- )
86
+ _cache[name] = TwitterPostTweet()
95
87
  return _cache[name]
96
88
  elif name == "reply_tweet":
97
89
  if name not in _cache:
98
- _cache[name] = TwitterReplyTweet(
99
- skill_store=store,
100
- )
90
+ _cache[name] = TwitterReplyTweet()
101
91
  return _cache[name]
102
92
  elif name == "get_timeline":
103
93
  if name not in _cache:
104
- _cache[name] = TwitterGetTimeline(
105
- skill_store=store,
106
- )
94
+ _cache[name] = TwitterGetTimeline()
107
95
  return _cache[name]
108
96
  elif name == "follow_user":
109
97
  if name not in _cache:
110
- _cache[name] = TwitterFollowUser(
111
- skill_store=store,
112
- )
98
+ _cache[name] = TwitterFollowUser()
113
99
  return _cache[name]
114
100
  elif name == "like_tweet":
115
101
  if name not in _cache:
116
- _cache[name] = TwitterLikeTweet(
117
- skill_store=store,
118
- )
102
+ _cache[name] = TwitterLikeTweet()
119
103
  return _cache[name]
120
104
  elif name == "retweet":
121
105
  if name not in _cache:
122
- _cache[name] = TwitterRetweet(
123
- skill_store=store,
124
- )
106
+ _cache[name] = TwitterRetweet()
125
107
  return _cache[name]
126
108
  elif name == "search_tweets":
127
109
  if name not in _cache:
128
- _cache[name] = TwitterSearchTweets(
129
- skill_store=store,
130
- )
110
+ _cache[name] = TwitterSearchTweets()
131
111
  return _cache[name]
132
112
  elif name == "get_user_by_username":
133
113
  if name not in _cache:
134
- _cache[name] = TwitterGetUserByUsername(
135
- skill_store=store,
136
- )
114
+ _cache[name] = TwitterGetUserByUsername()
137
115
  return _cache[name]
138
116
  elif name == "get_user_tweets":
139
117
  if name not in _cache:
140
- _cache[name] = TwitterGetUserTweets(
141
- skill_store=store,
142
- )
118
+ _cache[name] = TwitterGetUserTweets()
143
119
  return _cache[name]
144
120
  else:
145
121
  logger.warning(f"Unknown Twitter skill: {name}")
@@ -1,10 +1,9 @@
1
- from datetime import datetime, timedelta, timezone
2
- from typing import Type
1
+ from datetime import UTC, datetime, timedelta
3
2
 
4
- from langchain.tools.base import ToolException
3
+ from langchain_core.tools.base import ToolException
5
4
  from pydantic import BaseModel, Field
6
5
 
7
- from intentkit.abstracts.skill import SkillStoreABC
6
+ from intentkit.config.config import config
8
7
  from intentkit.skills.base import IntentKitSkill
9
8
  from intentkit.utils.error import RateLimitExceeded
10
9
 
@@ -14,10 +13,7 @@ class TwitterBaseTool(IntentKitSkill):
14
13
 
15
14
  name: str = Field(description="The name of the tool")
16
15
  description: str = Field(description="A description of what the tool does")
17
- args_schema: Type[BaseModel]
18
- skill_store: SkillStoreABC = Field(
19
- description="The skill store for persisting data"
20
- )
16
+ args_schema: type[BaseModel]
21
17
 
22
18
  def get_api_key(self) -> dict:
23
19
  context = self.get_context()
@@ -25,20 +21,21 @@ class TwitterBaseTool(IntentKitSkill):
25
21
  api_key_provider = skill_config.get("api_key_provider")
26
22
  if api_key_provider == "platform":
27
23
  # Return platform keys (these need to be added to config.py)
28
- return {
29
- "consumer_key": self.skill_store.get_system_config(
30
- "twitter_consumer_key"
31
- ),
32
- "consumer_secret": self.skill_store.get_system_config(
33
- "twitter_consumer_secret"
34
- ),
35
- "access_token": self.skill_store.get_system_config(
36
- "twitter_access_token"
37
- ),
38
- "access_token_secret": self.skill_store.get_system_config(
39
- "twitter_access_token_secret"
24
+ platform_keys = {
25
+ "consumer_key": getattr(config, "twitter_consumer_key", None),
26
+ "consumer_secret": getattr(config, "twitter_consumer_secret", None),
27
+ "access_token": getattr(config, "twitter_access_token", None),
28
+ "access_token_secret": getattr(
29
+ config, "twitter_access_token_secret", None
40
30
  ),
41
31
  }
32
+ missing = [key for key, value in platform_keys.items() if not value]
33
+ if missing:
34
+ raise ToolException(
35
+ "Twitter platform API keys are not configured: "
36
+ + ", ".join(missing)
37
+ )
38
+ return platform_keys
42
39
  # for backward compatibility or agent_owner provider
43
40
  elif api_key_provider == "agent_owner":
44
41
  required_keys = [
@@ -63,24 +60,19 @@ class TwitterBaseTool(IntentKitSkill):
63
60
  def category(self) -> str:
64
61
  return "twitter"
65
62
 
66
- async def check_rate_limit(
67
- self, agent_id: str, max_requests: int = 1, interval: int = 15
68
- ) -> None:
63
+ async def check_rate_limit(self, max_requests: int = 1, interval: int = 15) -> None:
69
64
  """Check if the rate limit has been exceeded.
70
65
 
71
66
  Args:
72
- agent_id: The ID of the agent.
73
67
  max_requests: Maximum number of requests allowed within the rate limit window.
74
68
  interval: Time interval in minutes for the rate limit window.
75
69
 
76
70
  Raises:
77
71
  RateLimitExceeded: If the rate limit has been exceeded.
78
72
  """
79
- rate_limit = await self.skill_store.get_agent_skill_data(
80
- agent_id, self.name, "rate_limit"
81
- )
73
+ rate_limit = await self.get_agent_skill_data("rate_limit")
82
74
 
83
- current_time = datetime.now(tz=timezone.utc)
75
+ current_time = datetime.now(tz=UTC)
84
76
 
85
77
  if (
86
78
  rate_limit
@@ -92,9 +84,7 @@ class TwitterBaseTool(IntentKitSkill):
92
84
  raise RateLimitExceeded("Rate limit exceeded")
93
85
 
94
86
  rate_limit["count"] += 1
95
- await self.skill_store.save_agent_skill_data(
96
- agent_id, self.name, "rate_limit", rate_limit
97
- )
87
+ await self.save_agent_skill_data("rate_limit", rate_limit)
98
88
 
99
89
  return
100
90
 
@@ -103,7 +93,5 @@ class TwitterBaseTool(IntentKitSkill):
103
93
  "count": 1,
104
94
  "reset_time": (current_time + timedelta(minutes=interval)).isoformat(),
105
95
  }
106
- await self.skill_store.save_agent_skill_data(
107
- agent_id, self.name, "rate_limit", new_rate_limit
108
- )
96
+ await self.save_agent_skill_data("rate_limit", new_rate_limit)
109
97
  return
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
@@ -34,7 +33,7 @@ class TwitterFollowUser(TwitterBaseTool):
34
33
 
35
34
  name: str = NAME
36
35
  description: str = PROMPT
37
- args_schema: Type[BaseModel] = TwitterFollowUserInput
36
+ args_schema: type[BaseModel] = TwitterFollowUserInput
38
37
 
39
38
  async def _arun(self, user_id: str, **kwargs) -> bool:
40
39
  context = self.get_context()
@@ -42,16 +41,13 @@ class TwitterFollowUser(TwitterBaseTool):
42
41
  skill_config = context.agent.skill_config(self.category)
43
42
  twitter = get_twitter_client(
44
43
  agent_id=context.agent_id,
45
- skill_store=self.skill_store,
46
44
  config=skill_config,
47
45
  )
48
46
  client = await twitter.get_client()
49
47
 
50
48
  # Check rate limit only when not using OAuth
51
49
  if not twitter.use_key:
52
- await self.check_rate_limit(
53
- context.agent_id, max_requests=5, interval=15
54
- )
50
+ await self.check_rate_limit(max_requests=5, interval=15)
55
51
 
56
52
  # Follow the user using tweepy client
57
53
  response = await client.follow_user(
@@ -1,6 +1,5 @@
1
1
  import logging
2
- from datetime import datetime, timedelta, timezone
3
- from typing import Type
2
+ from datetime import UTC, datetime, timedelta
4
3
 
5
4
  from langchain_core.tools import ToolException
6
5
  from pydantic import BaseModel
@@ -38,7 +37,7 @@ class TwitterGetMentions(TwitterBaseTool):
38
37
 
39
38
  name: str = NAME
40
39
  description: str = PROMPT
41
- args_schema: Type[BaseModel] = TwitterGetMentionsInput
40
+ args_schema: type[BaseModel] = TwitterGetMentionsInput
42
41
 
43
42
  async def _arun(self, **kwargs) -> list[Tweet]:
44
43
  context = self.get_context()
@@ -46,7 +45,6 @@ class TwitterGetMentions(TwitterBaseTool):
46
45
  skill_config = context.agent.skill_config(self.category)
47
46
  twitter = get_twitter_client(
48
47
  agent_id=context.agent_id,
49
- skill_store=self.skill_store,
50
48
  config=skill_config,
51
49
  )
52
50
  client = await twitter.get_client()
@@ -56,15 +54,12 @@ class TwitterGetMentions(TwitterBaseTool):
56
54
  # Check rate limit only when not using OAuth
57
55
  if not twitter.use_key:
58
56
  await self.check_rate_limit(
59
- context.agent_id,
60
57
  max_requests=1,
61
58
  interval=15,
62
59
  )
63
60
 
64
61
  # get since id from store
65
- last = await self.skill_store.get_agent_skill_data(
66
- context.agent_id, self.name, "last"
67
- )
62
+ last = await self.get_agent_skill_data("last")
68
63
  last = last or {}
69
64
  max_results = 10
70
65
  since_id = last.get("since_id")
@@ -72,7 +67,7 @@ class TwitterGetMentions(TwitterBaseTool):
72
67
  max_results = 30
73
68
 
74
69
  # Always get mentions for the last day
75
- start_time = datetime.now(tz=timezone.utc) - timedelta(days=1)
70
+ start_time = datetime.now(tz=UTC) - timedelta(days=1)
76
71
 
77
72
  user_id = twitter.self_id
78
73
  if not user_id:
@@ -113,9 +108,7 @@ class TwitterGetMentions(TwitterBaseTool):
113
108
  # Update since_id in store
114
109
  if mentions.get("meta") and mentions["meta"].get("newest_id"):
115
110
  last["since_id"] = mentions["meta"].get("newest_id")
116
- await self.skill_store.save_agent_skill_data(
117
- context.agent_id, self.name, "last", last
118
- )
111
+ await self.save_agent_skill_data("last", last)
119
112
 
120
113
  return mentions
121
114
 
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from pydantic import BaseModel
5
4
 
@@ -34,7 +33,7 @@ class TwitterGetTimeline(TwitterBaseTool):
34
33
 
35
34
  name: str = NAME
36
35
  description: str = PROMPT
37
- args_schema: Type[BaseModel] = TwitterGetTimelineInput
36
+ args_schema: type[BaseModel] = TwitterGetTimelineInput
38
37
 
39
38
  async def _arun(self, **kwargs):
40
39
  context = self.get_context()
@@ -45,21 +44,16 @@ class TwitterGetTimeline(TwitterBaseTool):
45
44
  skill_config = context.agent.skill_config(self.category)
46
45
  twitter = get_twitter_client(
47
46
  agent_id=context.agent_id,
48
- skill_store=self.skill_store,
49
47
  config=skill_config,
50
48
  )
51
49
  client = await twitter.get_client()
52
50
 
53
51
  # Check rate limit only when not using OAuth
54
52
  if not twitter.use_key:
55
- await self.check_rate_limit(
56
- context.agent_id, max_requests=1, interval=15
57
- )
53
+ await self.check_rate_limit(max_requests=1, interval=15)
58
54
 
59
55
  # get since id from store
60
- last = await self.skill_store.get_agent_skill_data(
61
- context.agent_id, self.name, "last"
62
- )
56
+ last = await self.get_agent_skill_data("last")
63
57
  last = last or {}
64
58
  since_id = last.get("since_id")
65
59
 
@@ -101,9 +95,7 @@ class TwitterGetTimeline(TwitterBaseTool):
101
95
  # Update the since_id in store for the next request
102
96
  if timeline.get("meta") and timeline["meta"].get("newest_id"):
103
97
  last["since_id"] = timeline["meta"]["newest_id"]
104
- await self.skill_store.save_agent_skill_data(
105
- context.agent_id, self.name, "last", last
106
- )
98
+ await self.save_agent_skill_data("last", last)
107
99
 
108
100
  return timeline
109
101
 
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from pydantic import BaseModel, Field
5
4
 
@@ -35,7 +34,7 @@ class TwitterGetUserByUsername(TwitterBaseTool):
35
34
 
36
35
  name: str = NAME
37
36
  description: str = PROMPT
38
- args_schema: Type[BaseModel] = TwitterGetUserByUsernameInput
37
+ args_schema: type[BaseModel] = TwitterGetUserByUsernameInput
39
38
 
40
39
  async def _arun(self, username: str, **kwargs):
41
40
  context = self.get_context()
@@ -43,16 +42,13 @@ class TwitterGetUserByUsername(TwitterBaseTool):
43
42
  skill_config = context.agent.skill_config(self.category)
44
43
  twitter = get_twitter_client(
45
44
  agent_id=context.agent_id,
46
- skill_store=self.skill_store,
47
45
  config=skill_config,
48
46
  )
49
47
  client = await twitter.get_client()
50
48
 
51
49
  # Check rate limit only when not using OAuth
52
50
  if not twitter.use_key:
53
- await self.check_rate_limit(
54
- context.agent_id, max_requests=5, interval=60 * 24
55
- )
51
+ await self.check_rate_limit(max_requests=5, interval=60 * 24)
56
52
 
57
53
  user_data = await client.get_user(
58
54
  username=username,
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import List, Optional, Type
3
2
 
4
3
  from pydantic import BaseModel, Field
5
4
 
@@ -21,7 +20,7 @@ class TwitterGetUserTweetsInput(BaseModel):
21
20
  """Input for TwitterGetUserTweets tool."""
22
21
 
23
22
  user_id: str = Field(description="The Twitter user ID to fetch tweets from")
24
- exclude: Optional[List[str]] = Field(
23
+ exclude: list[str] | None = Field(
25
24
  default=["replies", "retweets"],
26
25
  description="Types of tweets to exclude (e.g., 'replies', 'retweets')",
27
26
  )
@@ -41,7 +40,7 @@ class TwitterGetUserTweets(TwitterBaseTool):
41
40
 
42
41
  name: str = NAME
43
42
  description: str = PROMPT
44
- args_schema: Type[BaseModel] = TwitterGetUserTweetsInput
43
+ args_schema: type[BaseModel] = TwitterGetUserTweetsInput
45
44
 
46
45
  async def _arun(self, **kwargs):
47
46
  context = self.get_context()
@@ -59,21 +58,16 @@ class TwitterGetUserTweets(TwitterBaseTool):
59
58
  skill_config = context.agent.skill_config(self.category)
60
59
  twitter = get_twitter_client(
61
60
  agent_id=context.agent_id,
62
- skill_store=self.skill_store,
63
61
  config=skill_config,
64
62
  )
65
63
  client = await twitter.get_client()
66
64
 
67
65
  # Check rate limit only when not using OAuth
68
66
  if not twitter.use_key:
69
- await self.check_rate_limit(
70
- context.agent_id, max_requests=1, interval=15
71
- )
67
+ await self.check_rate_limit(max_requests=1, interval=15)
72
68
 
73
69
  # get since id from store
74
- last = await self.skill_store.get_agent_skill_data(
75
- context.agent_id, self.name, user_id
76
- )
70
+ last = await self.get_agent_skill_data(user_id)
77
71
  last = last or {}
78
72
  since_id = last.get("since_id")
79
73
 
@@ -112,9 +106,7 @@ class TwitterGetUserTweets(TwitterBaseTool):
112
106
  # Update the since_id in store for the next request
113
107
  if tweets.get("meta") and tweets["meta"].get("newest_id"):
114
108
  last["since_id"] = tweets["meta"]["newest_id"]
115
- await self.skill_store.save_agent_skill_data(
116
- context.agent_id, self.name, user_id, last
117
- )
109
+ await self.save_agent_skill_data(user_id, last)
118
110
 
119
111
  return tweets
120
112
 
@@ -1,5 +1,4 @@
1
1
  import logging
2
- from typing import Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
@@ -32,7 +31,7 @@ class TwitterLikeTweet(TwitterBaseTool):
32
31
 
33
32
  name: str = NAME
34
33
  description: str = PROMPT
35
- args_schema: Type[BaseModel] = TwitterLikeTweetInput
34
+ args_schema: type[BaseModel] = TwitterLikeTweetInput
36
35
 
37
36
  async def _arun(self, tweet_id: str, **kwargs):
38
37
  context = self.get_context()
@@ -40,16 +39,13 @@ class TwitterLikeTweet(TwitterBaseTool):
40
39
  skill_config = context.agent.skill_config(self.category)
41
40
  twitter = get_twitter_client(
42
41
  agent_id=context.agent_id,
43
- skill_store=self.skill_store,
44
42
  config=skill_config,
45
43
  )
46
44
  client = await twitter.get_client()
47
45
 
48
46
  # Check rate limit only when not using OAuth
49
47
  if not twitter.use_key:
50
- await self.check_rate_limit(
51
- context.agent_id, max_requests=100, interval=1440
52
- )
48
+ await self.check_rate_limit(max_requests=100, interval=1440)
53
49
 
54
50
  # Like the tweet using tweepy client
55
51
  response = await client.like(tweet_id=tweet_id, user_auth=twitter.use_key)
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
6
5
 
7
6
  from intentkit.clients import get_twitter_client
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.twitter.base import TwitterBaseTool
9
9
 
10
10
  NAME = "twitter_post_tweet"
@@ -23,7 +23,7 @@ class TwitterPostTweetInput(BaseModel):
23
23
  description="Tweet text (280 chars for regular users, 25,000 bytes for verified)",
24
24
  max_length=25000,
25
25
  )
26
- image: Optional[str] = Field(
26
+ image: str | None = Field(
27
27
  default=None, description="Optional URL of an image to attach to the tweet"
28
28
  )
29
29
 
@@ -41,12 +41,12 @@ class TwitterPostTweet(TwitterBaseTool):
41
41
 
42
42
  name: str = NAME
43
43
  description: str = PROMPT
44
- args_schema: Type[BaseModel] = TwitterPostTweetInput
44
+ args_schema: type[BaseModel] = TwitterPostTweetInput
45
45
 
46
46
  async def _arun(
47
47
  self,
48
48
  text: str,
49
- image: Optional[str] = None,
49
+ image: str | None = None,
50
50
  **kwargs,
51
51
  ):
52
52
  context = self.get_context()
@@ -54,16 +54,13 @@ class TwitterPostTweet(TwitterBaseTool):
54
54
  skill_config = context.agent.skill_config(self.category)
55
55
  twitter = get_twitter_client(
56
56
  agent_id=context.agent_id,
57
- skill_store=self.skill_store,
58
57
  config=skill_config,
59
58
  )
60
59
  client = await twitter.get_client()
61
60
 
62
61
  # Check rate limit only when not using OAuth
63
62
  if not twitter.use_key:
64
- await self.check_rate_limit(
65
- context.agent_id, max_requests=24, interval=1440
66
- )
63
+ await self.check_rate_limit(max_requests=24, interval=1440)
67
64
 
68
65
  media_ids = []
69
66
  image_warning = ""
@@ -71,7 +68,7 @@ class TwitterPostTweet(TwitterBaseTool):
71
68
  # Handle image upload if provided
72
69
  if image:
73
70
  # Validate image URL - must be from system's S3 CDN
74
- aws_s3_cdn_url = self.skill_store.get_system_config("aws_s3_cdn_url")
71
+ aws_s3_cdn_url = config.aws_s3_cdn_url
75
72
  if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
76
73
  # Use the TwitterClient method to upload the image
77
74
  media_ids = await twitter.upload_media(context.agent_id, image)
@@ -1,10 +1,10 @@
1
1
  import logging
2
- from typing import Optional, Type
3
2
 
4
3
  from langchain_core.tools import ToolException
5
4
  from pydantic import BaseModel, Field
6
5
 
7
6
  from intentkit.clients import get_twitter_client
7
+ from intentkit.config.config import config
8
8
  from intentkit.skills.twitter.base import TwitterBaseTool
9
9
 
10
10
  NAME = "twitter_reply_tweet"
@@ -24,7 +24,7 @@ class TwitterReplyTweetInput(BaseModel):
24
24
  description="Tweet text (280 chars for regular users, 25,000 bytes for verified)",
25
25
  max_length=25000,
26
26
  )
27
- image: Optional[str] = Field(
27
+ image: str | None = Field(
28
28
  default=None, description="Optional URL of an image to attach to the reply"
29
29
  )
30
30
 
@@ -42,13 +42,13 @@ class TwitterReplyTweet(TwitterBaseTool):
42
42
 
43
43
  name: str = NAME
44
44
  description: str = PROMPT
45
- args_schema: Type[BaseModel] = TwitterReplyTweetInput
45
+ args_schema: type[BaseModel] = TwitterReplyTweetInput
46
46
 
47
47
  async def _arun(
48
48
  self,
49
49
  tweet_id: str,
50
50
  text: str,
51
- image: Optional[str] = None,
51
+ image: str | None = None,
52
52
  **kwargs,
53
53
  ):
54
54
  context = self.get_context()
@@ -56,16 +56,13 @@ class TwitterReplyTweet(TwitterBaseTool):
56
56
  skill_config = context.agent.skill_config(self.category)
57
57
  twitter = get_twitter_client(
58
58
  agent_id=context.agent_id,
59
- skill_store=self.skill_store,
60
59
  config=skill_config,
61
60
  )
62
61
  client = await twitter.get_client()
63
62
 
64
63
  # Check rate limit only when not using OAuth
65
64
  if not twitter.use_key:
66
- await self.check_rate_limit(
67
- context.agent_id, max_requests=48, interval=1440
68
- )
65
+ await self.check_rate_limit(max_requests=48, interval=1440)
69
66
 
70
67
  media_ids = []
71
68
  image_warning = ""
@@ -73,7 +70,7 @@ class TwitterReplyTweet(TwitterBaseTool):
73
70
  # Handle image upload if provided
74
71
  if image:
75
72
  # Validate image URL - must be from system's S3 CDN
76
- aws_s3_cdn_url = self.skill_store.get_system_config("aws_s3_cdn_url")
73
+ aws_s3_cdn_url = config.aws_s3_cdn_url
77
74
  if aws_s3_cdn_url and image.startswith(aws_s3_cdn_url):
78
75
  # Use the TwitterClient method to upload the image
79
76
  media_ids = await twitter.upload_media(context.agent_id, image)