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,22 +1,24 @@
1
- # app/config.py
2
1
  import json
3
2
  import logging
4
3
  import os
4
+ from typing import overload
5
5
 
6
6
  from dotenv import load_dotenv
7
7
 
8
8
  from intentkit.utils.chain import ChainProvider, QuicknodeChainProvider
9
9
  from intentkit.utils.logging import setup_logging
10
- from intentkit.utils.s3 import init_s3
11
10
  from intentkit.utils.slack_alert import init_slack
12
11
 
12
+ SecretsMap = dict[str, str | int]
13
+ DatabaseConfig = dict[str, str | int | bool]
14
+
13
15
  # Load environment variables from .env file
14
- load_dotenv()
16
+ _ = load_dotenv()
15
17
 
16
18
  logger = logging.getLogger(__name__)
17
19
 
18
20
 
19
- def load_from_aws(name):
21
+ def load_from_aws(name: str) -> SecretsMap:
20
22
  import botocore.session
21
23
  from aws_secretsmanager_caching import SecretCache, SecretCacheConfig
22
24
 
@@ -28,25 +30,25 @@ def load_from_aws(name):
28
30
 
29
31
 
30
32
  class Config:
31
- def __init__(self):
33
+ def __init__(self) -> None:
32
34
  # ==== this part can only be load from env
33
- self.env = os.getenv("ENV", "local")
34
- self.release = os.getenv("RELEASE", "local")
35
- secret_name = os.getenv("AWS_SECRET_NAME")
36
- db_secret_name = os.getenv("AWS_DB_SECRET_NAME")
35
+ self.env: str = os.getenv("ENV", "local")
36
+ self.release: str = os.getenv("RELEASE", "local")
37
+ secret_name: str | None = os.getenv("AWS_SECRET_NAME")
38
+ db_secret_name: str | None = os.getenv("AWS_DB_SECRET_NAME")
37
39
  # ==== load from aws secrets manager
40
+ self.secrets: SecretsMap = {}
38
41
  if secret_name:
39
42
  self.secrets = load_from_aws(secret_name)
40
- else:
41
- self.secrets = {}
43
+ self.db: DatabaseConfig
42
44
  if db_secret_name:
43
- self.db = load_from_aws(db_secret_name)
45
+ secret_db: SecretsMap = load_from_aws(db_secret_name)
44
46
  # format the db config
45
- self.db["port"] = str(self.db["port"])
47
+ secret_db["port"] = str(secret_db["port"])
46
48
  # only keep the necessary fields
47
49
  self.db = {
48
50
  k: v
49
- for k, v in self.db.items()
51
+ for k, v in secret_db.items()
50
52
  if k in ["username", "password", "host", "dbname", "port"]
51
53
  }
52
54
  else:
@@ -60,102 +62,123 @@ class Config:
60
62
  # ==== this part can be load from env or aws secrets manager
61
63
  self.db["auto_migrate"] = self.load("DB_AUTO_MIGRATE", "true") == "true"
62
64
  self.db["pool_size"] = self.load_int("DB_POOL_SIZE", 3)
63
- self.debug = self.load("DEBUG") == "true"
64
- self.debug_checkpoint = (
65
+ self.debug: bool = self.load("DEBUG") == "true"
66
+ self.debug_checkpoint: bool = (
65
67
  self.load("DEBUG_CHECKPOINT", "false") == "true"
66
68
  ) # log with checkpoint
67
69
  # Redis
68
- self.redis_host = self.load("REDIS_HOST")
69
- self.redis_port = self.load_int("REDIS_PORT", 6379)
70
- self.redis_db = self.load_int("REDIS_DB", 0)
71
- # AWS
72
- self.aws_s3_bucket = self.load("AWS_S3_BUCKET")
73
- self.aws_s3_cdn_url = self.load("AWS_S3_CDN_URL")
70
+ self.redis_host: str | None = self.load("REDIS_HOST")
71
+ self.redis_port: int = self.load_int("REDIS_PORT", 6379)
72
+ self.redis_db: int = self.load_int("REDIS_DB", 0)
73
+ # AWS S3
74
+ self.aws_s3_bucket: str | None = self.load("AWS_S3_BUCKET")
75
+ self.aws_s3_cdn_url: str | None = self.load("AWS_S3_CDN_URL")
76
+ # If using custom S3 endpoint
77
+ self.aws_s3_endpoint_url: str | None = self.load("AWS_S3_ENDPOINT_URL")
78
+ self.aws_s3_region_name: str | None = self.load("AWS_S3_REGION_NAME")
79
+ self.aws_s3_access_key_id: str | None = self.load("AWS_S3_ACCESS_KEY_ID")
80
+ self.aws_s3_secret_access_key: str | None = self.load(
81
+ "AWS_S3_SECRET_ACCESS_KEY"
82
+ )
74
83
  # Internal API
75
- self.internal_base_url = self.load("INTERNAL_BASE_URL", "http://intent-api")
76
- self.admin_auth_enabled = self.load("ADMIN_AUTH_ENABLED", "false") == "true"
77
- self.admin_jwt_secret = self.load("ADMIN_JWT_SECRET")
78
- self.debug_auth_enabled = self.load("DEBUG_AUTH_ENABLED", "false") == "true"
79
- self.debug_username = self.load("DEBUG_USERNAME")
80
- self.debug_password = self.load("DEBUG_PASSWORD")
81
- self.admin_llm_skill_control = (
82
- self.load("ADMIN_LLM_SKILL_CONTROL", "false") == "true"
84
+ self.internal_base_url: str = self.load(
85
+ "INTERNAL_BASE_URL", "http://intent-api"
86
+ )
87
+ self.admin_auth_enabled: bool = (
88
+ self.load("ADMIN_AUTH_ENABLED", "false") == "true"
83
89
  )
90
+ self.admin_jwt_secret: str | None = self.load("ADMIN_JWT_SECRET")
91
+ self.debug_auth_enabled: bool = (
92
+ self.load("DEBUG_AUTH_ENABLED", "false") == "true"
93
+ )
94
+ self.debug_username: str | None = self.load("DEBUG_USERNAME")
95
+ self.debug_password: str | None = self.load("DEBUG_PASSWORD")
84
96
  # Payment
85
- self.payment_enabled = self.load("PAYMENT_ENABLED", "false") == "true"
97
+ self.payment_enabled: bool = self.load("PAYMENT_ENABLED", "false") == "true"
86
98
  # Open API for agent
87
- self.open_api_base_url = self.load("OPEN_API_BASE_URL", "http://localhost:8000")
88
- # CDP - AgentKit 0.6.0 Configuration
89
- self.cdp_api_key_id = self.load("CDP_API_KEY_ID")
90
- self.cdp_api_key_secret = self.load("CDP_API_KEY_SECRET")
91
- self.cdp_wallet_secret = self.load("CDP_WALLET_SECRET")
99
+ self.open_api_base_url: str = self.load(
100
+ "OPEN_API_BASE_URL", "http://localhost:8000"
101
+ )
102
+ # CDP - AgentKit 0.7.x Configuration
103
+ self.cdp_api_key_id: str | None = self.load("CDP_API_KEY_ID")
104
+ self.cdp_api_key_secret: str | None = self.load("CDP_API_KEY_SECRET")
105
+ self.cdp_wallet_secret: str | None = self.load("CDP_WALLET_SECRET")
92
106
  # LLM providers
93
- self.openai_api_key = self.load("OPENAI_API_KEY")
94
- self.deepseek_api_key = self.load("DEEPSEEK_API_KEY")
95
- self.xai_api_key = self.load("XAI_API_KEY")
96
- self.eternal_api_key = self.load("ETERNAL_API_KEY")
97
- self.reigent_api_key = self.load("REIGENT_API_KEY")
98
- self.venice_api_key = self.load("VENICE_API_KEY")
107
+ self.openai_api_key: str | None = self.load("OPENAI_API_KEY")
108
+ self.deepseek_api_key: str | None = self.load("DEEPSEEK_API_KEY")
109
+ self.xai_api_key: str | None = self.load("XAI_API_KEY")
110
+ self.eternal_api_key: str | None = self.load("ETERNAL_API_KEY")
111
+ self.reigent_api_key: str | None = self.load("REIGENT_API_KEY")
112
+ self.venice_api_key: str | None = self.load("VENICE_API_KEY")
113
+ self.gatewayz_api_key: str | None = self.load("GATEWAYZ_API_KEY")
99
114
  # LLM Config
100
- self.system_prompt = self.load("SYSTEM_PROMPT")
101
- self.intentkit_prompt = self.load("INTENTKIT_PROMPT")
102
- self.input_token_limit = self.load_int("INPUT_TOKEN_LIMIT", 60000)
115
+ self.system_prompt: str | None = self.load("SYSTEM_PROMPT")
116
+ self.intentkit_prompt: str | None = self.load("INTENTKIT_PROMPT")
117
+ self.input_token_limit: int = self.load_int("INPUT_TOKEN_LIMIT", 60000)
103
118
  # XMTP
104
- self.xmtp_system_prompt = self.load(
119
+ self.xmtp_system_prompt: str | None = self.load(
105
120
  "XMTP_SYSTEM_PROMPT",
106
121
  "You are assisting a user who uses an XMTP client that only displays plain-text messages, so do not use Markdown formatting.",
107
122
  )
108
123
  # Telegram server settings
109
- self.tg_system_prompt = self.load("TG_SYSTEM_PROMPT")
110
- self.tg_base_url = self.load("TG_BASE_URL")
111
- self.tg_server_host = self.load("TG_SERVER_HOST", "127.0.0.1")
112
- self.tg_server_port = self.load("TG_SERVER_PORT", "8081")
113
- self.tg_new_agent_poll_interval = self.load("TG_NEW_AGENT_POLL_INTERVAL", "60")
124
+ self.tg_system_prompt: str | None = self.load("TG_SYSTEM_PROMPT")
125
+ self.tg_base_url: str | None = self.load("TG_BASE_URL")
126
+ self.tg_server_host: str = self.load("TG_SERVER_HOST", "127.0.0.1")
127
+ self.tg_server_port: str = self.load("TG_SERVER_PORT", "8081")
128
+ self.tg_new_agent_poll_interval: str = self.load(
129
+ "TG_NEW_AGENT_POLL_INTERVAL", "60"
130
+ )
131
+ # Discord server settings
132
+ self.discord_new_agent_poll_interval: str = self.load(
133
+ "DISCORD_NEW_AGENT_POLL_INTERVAL", "30"
134
+ )
114
135
  # Twitter
115
- self.twitter_oauth2_client_id = self.load("TWITTER_OAUTH2_CLIENT_ID")
116
- self.twitter_oauth2_client_secret = self.load("TWITTER_OAUTH2_CLIENT_SECRET")
117
- self.twitter_oauth2_redirect_uri = self.load("TWITTER_OAUTH2_REDIRECT_URI")
118
- self.twitter_entrypoint_interval = self.load_int(
136
+ self.twitter_oauth2_client_id: str | None = self.load(
137
+ "TWITTER_OAUTH2_CLIENT_ID"
138
+ )
139
+ self.twitter_oauth2_client_secret: str | None = self.load(
140
+ "TWITTER_OAUTH2_CLIENT_SECRET"
141
+ )
142
+ self.twitter_oauth2_redirect_uri: str | None = self.load(
143
+ "TWITTER_OAUTH2_REDIRECT_URI"
144
+ )
145
+ self.twitter_entrypoint_interval: int = self.load_int(
119
146
  "TWITTER_ENTRYPOINT_INTERVAL", 5
120
147
  ) # in minutes
121
148
  # Slack Alert
122
- self.slack_alert_token = self.load("SLACK_ALERT_TOKEN")
123
- self.slack_alert_channel = self.load("SLACK_ALERT_CHANNEL")
149
+ self.slack_alert_token: str | None = self.load("SLACK_ALERT_TOKEN")
150
+ self.slack_alert_channel: str | None = self.load("SLACK_ALERT_CHANNEL")
124
151
  # Skills - Platform Hosted Keys
125
- self.acolyt_api_key = self.load("ACOLYT_API_KEY")
126
- self.allora_api_key = self.load("ALLORA_API_KEY")
127
- self.elfa_api_key = self.load("ELFA_API_KEY")
128
- self.heurist_api_key = self.load("HEURIST_API_KEY")
129
- self.enso_api_token = self.load("ENSO_API_TOKEN")
130
- self.dapplooker_api_key = self.load("DAPPLOOKER_API_KEY")
131
- self.moralis_api_key = self.load("MORALIS_API_KEY")
132
- self.tavily_api_key = self.load("TAVILY_API_KEY")
133
- self.cookiefun_api_key = self.load("COOKIEFUN_API_KEY")
134
- self.firecrawl_api_key = self.load("FIRECRAWL_API_KEY")
152
+ self.acolyt_api_key: str | None = self.load("ACOLYT_API_KEY")
153
+ self.allora_api_key: str | None = self.load("ALLORA_API_KEY")
154
+ self.elfa_api_key: str | None = self.load("ELFA_API_KEY")
155
+ self.heurist_api_key: str | None = self.load("HEURIST_API_KEY")
156
+ self.enso_api_token: str | None = self.load("ENSO_API_TOKEN")
157
+ self.dapplooker_api_key: str | None = self.load("DAPPLOOKER_API_KEY")
158
+ self.moralis_api_key: str | None = self.load("MORALIS_API_KEY")
159
+ self.tavily_api_key: str | None = self.load("TAVILY_API_KEY")
160
+ self.cookiefun_api_key: str | None = self.load("COOKIEFUN_API_KEY")
161
+ self.firecrawl_api_key: str | None = self.load("FIRECRAWL_API_KEY")
135
162
  # Sentry
136
- self.sentry_dsn = self.load("SENTRY_DSN")
137
- self.sentry_sample_rate = self.load_float("SENTRY_SAMPLE_RATE", 0.1)
138
- self.sentry_traces_sample_rate = self.load_float(
163
+ self.sentry_dsn: str | None = self.load("SENTRY_DSN")
164
+ self.sentry_sample_rate: float = self.load_float("SENTRY_SAMPLE_RATE", 0.1)
165
+ self.sentry_traces_sample_rate: float = self.load_float(
139
166
  "SENTRY_TRACES_SAMPLE_RATE", 0.01
140
167
  )
141
- self.sentry_profiles_sample_rate = self.load_float(
168
+ self.sentry_profiles_sample_rate: float = self.load_float(
142
169
  "SENTRY_PROFILES_SAMPLE_RATE", 0.01
143
170
  )
144
171
  # RPC Providers
145
- self.quicknode_api_key = self.load("QUICKNODE_API_KEY")
172
+ self.quicknode_api_key: str | None = self.load("QUICKNODE_API_KEY")
173
+ self.chain_provider: ChainProvider | None = None
146
174
  if self.quicknode_api_key:
147
- self.chain_provider: ChainProvider = QuicknodeChainProvider(
148
- self.quicknode_api_key
149
- )
150
- if hasattr(self, "chain_provider"):
175
+ self.chain_provider = QuicknodeChainProvider(self.quicknode_api_key)
176
+ if self.chain_provider:
151
177
  self.chain_provider.init_chain_configs()
152
- self.rpc_networks = self.load(
153
- "RPC_NETWORKS", "base-mainnet,base-sepolia,ethereum-sepolia,solana-mainnet"
154
- )
155
178
 
156
179
  # Nation
157
- self.nation_api_key = self.load("NATION_API_KEY")
158
- self.nation_api_url = self.load("NATION_API_URL", "")
180
+ self.nation_api_key: str | None = self.load("NATION_API_KEY")
181
+ self.nation_api_url: str = self.load("NATION_API_URL", "")
159
182
 
160
183
  # ===== config loaded
161
184
  # Now we know the env, set up logging
@@ -165,13 +188,23 @@ class Config:
165
188
  # If the slack alert token exists, init it
166
189
  if self.slack_alert_token and self.slack_alert_channel:
167
190
  init_slack(self.slack_alert_token, self.slack_alert_channel)
168
- # If the AWS S3 bucket and CDN URL exist, init it
169
- if self.aws_s3_bucket and self.aws_s3_cdn_url:
170
- init_s3(self.aws_s3_bucket, self.aws_s3_cdn_url, self.env)
171
191
 
172
- def load(self, key, default=None):
192
+ @overload
193
+ def load(self, key: str) -> str | None: ... # noqa: F811
194
+
195
+ @overload
196
+ def load(self, key: str, default: str) -> str: ... # noqa: F811
197
+
198
+ def load(self, key: str, default: str | None = None) -> str | None:
173
199
  """Load a secret from the secrets map or env"""
174
- value = self.secrets.get(key, os.getenv(key, default))
200
+ env_value = os.getenv(key, default)
201
+ raw_value = self.secrets.get(key, env_value)
202
+ if raw_value is None:
203
+ value: str | None = default
204
+ elif isinstance(raw_value, str):
205
+ value = raw_value
206
+ else:
207
+ value = str(raw_value)
175
208
 
176
209
  # If value is empty string, use default instead
177
210
  if value == "":
@@ -183,10 +216,10 @@ class Config:
183
216
  value = value[1:-1]
184
217
  return value
185
218
 
186
- def load_int(self, key, default=0):
219
+ def load_int(self, key: str, default: int = 0) -> int:
187
220
  """Load an integer value from env, handling empty strings gracefully"""
188
221
  value = self.load(key, str(default))
189
- if value is None or value == "":
222
+ if not value:
190
223
  return default
191
224
  try:
192
225
  return int(value)
@@ -194,10 +227,10 @@ class Config:
194
227
  logger.warning(f"Invalid integer value for {key}, using default: {default}")
195
228
  return default
196
229
 
197
- def load_float(self, key, default=0.0):
230
+ def load_float(self, key: str, default: float = 0.0) -> float:
198
231
  """Load a float value from env, handling empty strings gracefully"""
199
232
  value = self.load(key, str(default))
200
- if value is None or value == "":
233
+ if not value:
201
234
  return default
202
235
  try:
203
236
  return float(value)