intentkit 0.5.0__py3-none-any.whl → 0.5.2__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 (366) hide show
  1. intentkit/__init__.py +17 -0
  2. intentkit/abstracts/__init__.py +0 -0
  3. intentkit/abstracts/agent.py +60 -0
  4. intentkit/abstracts/api.py +4 -0
  5. intentkit/abstracts/engine.py +38 -0
  6. intentkit/abstracts/exception.py +9 -0
  7. intentkit/abstracts/graph.py +25 -0
  8. intentkit/abstracts/skill.py +129 -0
  9. intentkit/abstracts/twitter.py +54 -0
  10. intentkit/clients/__init__.py +14 -0
  11. intentkit/clients/cdp.py +53 -0
  12. intentkit/clients/twitter.py +445 -0
  13. intentkit/config/__init__.py +0 -0
  14. intentkit/config/config.py +164 -0
  15. intentkit/core/__init__.py +0 -0
  16. intentkit/core/agent.py +191 -0
  17. intentkit/core/api.py +40 -0
  18. intentkit/core/client.py +45 -0
  19. intentkit/core/credit.py +1767 -0
  20. intentkit/core/engine.py +1018 -0
  21. intentkit/core/node.py +223 -0
  22. intentkit/core/prompt.py +58 -0
  23. intentkit/core/skill.py +124 -0
  24. intentkit/models/agent.py +1689 -0
  25. intentkit/models/agent_data.py +810 -0
  26. intentkit/models/agent_schema.json +733 -0
  27. intentkit/models/app_setting.py +156 -0
  28. intentkit/models/base.py +9 -0
  29. intentkit/models/chat.py +581 -0
  30. intentkit/models/conversation.py +286 -0
  31. intentkit/models/credit.py +1406 -0
  32. intentkit/models/db.py +120 -0
  33. intentkit/models/db_mig.py +102 -0
  34. intentkit/models/generator.py +347 -0
  35. intentkit/models/llm.py +746 -0
  36. intentkit/models/redis.py +132 -0
  37. intentkit/models/skill.py +466 -0
  38. intentkit/models/user.py +243 -0
  39. intentkit/skills/__init__.py +12 -0
  40. intentkit/skills/acolyt/__init__.py +83 -0
  41. intentkit/skills/acolyt/acolyt.jpg +0 -0
  42. intentkit/skills/acolyt/ask.py +128 -0
  43. intentkit/skills/acolyt/base.py +28 -0
  44. intentkit/skills/acolyt/schema.json +89 -0
  45. intentkit/skills/aixbt/README.md +71 -0
  46. intentkit/skills/aixbt/__init__.py +73 -0
  47. intentkit/skills/aixbt/aixbt.jpg +0 -0
  48. intentkit/skills/aixbt/base.py +21 -0
  49. intentkit/skills/aixbt/projects.py +153 -0
  50. intentkit/skills/aixbt/schema.json +99 -0
  51. intentkit/skills/allora/__init__.py +83 -0
  52. intentkit/skills/allora/allora.jpeg +0 -0
  53. intentkit/skills/allora/base.py +28 -0
  54. intentkit/skills/allora/price.py +130 -0
  55. intentkit/skills/allora/schema.json +89 -0
  56. intentkit/skills/base.py +174 -0
  57. intentkit/skills/carv/README.md +95 -0
  58. intentkit/skills/carv/__init__.py +121 -0
  59. intentkit/skills/carv/base.py +183 -0
  60. intentkit/skills/carv/carv.webp +0 -0
  61. intentkit/skills/carv/fetch_news.py +92 -0
  62. intentkit/skills/carv/onchain_query.py +164 -0
  63. intentkit/skills/carv/schema.json +137 -0
  64. intentkit/skills/carv/token_info_and_price.py +110 -0
  65. intentkit/skills/cdp/__init__.py +137 -0
  66. intentkit/skills/cdp/base.py +21 -0
  67. intentkit/skills/cdp/cdp.png +0 -0
  68. intentkit/skills/cdp/get_balance.py +81 -0
  69. intentkit/skills/cdp/schema.json +473 -0
  70. intentkit/skills/chainlist/README.md +38 -0
  71. intentkit/skills/chainlist/__init__.py +54 -0
  72. intentkit/skills/chainlist/base.py +21 -0
  73. intentkit/skills/chainlist/chain_lookup.py +208 -0
  74. intentkit/skills/chainlist/chainlist.png +0 -0
  75. intentkit/skills/chainlist/schema.json +47 -0
  76. intentkit/skills/common/__init__.py +82 -0
  77. intentkit/skills/common/base.py +21 -0
  78. intentkit/skills/common/common.jpg +0 -0
  79. intentkit/skills/common/current_time.py +84 -0
  80. intentkit/skills/common/schema.json +57 -0
  81. intentkit/skills/cookiefun/README.md +121 -0
  82. intentkit/skills/cookiefun/__init__.py +78 -0
  83. intentkit/skills/cookiefun/base.py +41 -0
  84. intentkit/skills/cookiefun/constants.py +18 -0
  85. intentkit/skills/cookiefun/cookiefun.png +0 -0
  86. intentkit/skills/cookiefun/get_account_details.py +171 -0
  87. intentkit/skills/cookiefun/get_account_feed.py +282 -0
  88. intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
  89. intentkit/skills/cookiefun/get_sectors.py +128 -0
  90. intentkit/skills/cookiefun/schema.json +155 -0
  91. intentkit/skills/cookiefun/search_accounts.py +225 -0
  92. intentkit/skills/cryptocompare/__init__.py +130 -0
  93. intentkit/skills/cryptocompare/api.py +159 -0
  94. intentkit/skills/cryptocompare/base.py +303 -0
  95. intentkit/skills/cryptocompare/cryptocompare.png +0 -0
  96. intentkit/skills/cryptocompare/fetch_news.py +96 -0
  97. intentkit/skills/cryptocompare/fetch_price.py +99 -0
  98. intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
  99. intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
  100. intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
  101. intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
  102. intentkit/skills/cryptocompare/schema.json +168 -0
  103. intentkit/skills/cryptopanic/__init__.py +108 -0
  104. intentkit/skills/cryptopanic/base.py +51 -0
  105. intentkit/skills/cryptopanic/cryptopanic.png +0 -0
  106. intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
  107. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
  108. intentkit/skills/cryptopanic/schema.json +103 -0
  109. intentkit/skills/dapplooker/README.md +92 -0
  110. intentkit/skills/dapplooker/__init__.py +83 -0
  111. intentkit/skills/dapplooker/base.py +26 -0
  112. intentkit/skills/dapplooker/dapplooker.jpg +0 -0
  113. intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
  114. intentkit/skills/dapplooker/schema.json +91 -0
  115. intentkit/skills/defillama/__init__.py +323 -0
  116. intentkit/skills/defillama/api.py +315 -0
  117. intentkit/skills/defillama/base.py +135 -0
  118. intentkit/skills/defillama/coins/__init__.py +0 -0
  119. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
  120. intentkit/skills/defillama/coins/fetch_block.py +98 -0
  121. intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
  122. intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
  123. intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
  124. intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
  125. intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
  126. intentkit/skills/defillama/config/__init__.py +0 -0
  127. intentkit/skills/defillama/config/chains.py +433 -0
  128. intentkit/skills/defillama/defillama.jpeg +0 -0
  129. intentkit/skills/defillama/fees/__init__.py +0 -0
  130. intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
  131. intentkit/skills/defillama/schema.json +383 -0
  132. intentkit/skills/defillama/stablecoins/__init__.py +0 -0
  133. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
  134. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
  135. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
  136. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
  137. intentkit/skills/defillama/tests/__init__.py +0 -0
  138. intentkit/skills/defillama/tests/api_integration.test.py +192 -0
  139. intentkit/skills/defillama/tests/api_unit.test.py +583 -0
  140. intentkit/skills/defillama/tvl/__init__.py +0 -0
  141. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
  142. intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
  143. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
  144. intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
  145. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
  146. intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
  147. intentkit/skills/defillama/volumes/__init__.py +0 -0
  148. intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
  149. intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
  150. intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
  151. intentkit/skills/defillama/yields/__init__.py +0 -0
  152. intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
  153. intentkit/skills/defillama/yields/fetch_pools.py +126 -0
  154. intentkit/skills/dexscreener/__init__.py +93 -0
  155. intentkit/skills/dexscreener/base.py +133 -0
  156. intentkit/skills/dexscreener/dexscreener.png +0 -0
  157. intentkit/skills/dexscreener/model/__init__.py +0 -0
  158. intentkit/skills/dexscreener/model/search_token_response.py +82 -0
  159. intentkit/skills/dexscreener/schema.json +48 -0
  160. intentkit/skills/dexscreener/search_token.py +321 -0
  161. intentkit/skills/dune_analytics/__init__.py +103 -0
  162. intentkit/skills/dune_analytics/base.py +46 -0
  163. intentkit/skills/dune_analytics/dune.png +0 -0
  164. intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
  165. intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
  166. intentkit/skills/dune_analytics/schema.json +99 -0
  167. intentkit/skills/elfa/README.md +100 -0
  168. intentkit/skills/elfa/__init__.py +123 -0
  169. intentkit/skills/elfa/base.py +28 -0
  170. intentkit/skills/elfa/elfa.jpg +0 -0
  171. intentkit/skills/elfa/mention.py +504 -0
  172. intentkit/skills/elfa/schema.json +153 -0
  173. intentkit/skills/elfa/stats.py +118 -0
  174. intentkit/skills/elfa/tokens.py +126 -0
  175. intentkit/skills/enso/README.md +75 -0
  176. intentkit/skills/enso/__init__.py +114 -0
  177. intentkit/skills/enso/abi/__init__.py +0 -0
  178. intentkit/skills/enso/abi/approval.py +279 -0
  179. intentkit/skills/enso/abi/erc20.py +14 -0
  180. intentkit/skills/enso/abi/route.py +129 -0
  181. intentkit/skills/enso/base.py +44 -0
  182. intentkit/skills/enso/best_yield.py +286 -0
  183. intentkit/skills/enso/enso.jpg +0 -0
  184. intentkit/skills/enso/networks.py +105 -0
  185. intentkit/skills/enso/prices.py +93 -0
  186. intentkit/skills/enso/route.py +300 -0
  187. intentkit/skills/enso/schema.json +212 -0
  188. intentkit/skills/enso/tokens.py +223 -0
  189. intentkit/skills/enso/wallet.py +381 -0
  190. intentkit/skills/github/README.md +63 -0
  191. intentkit/skills/github/__init__.py +54 -0
  192. intentkit/skills/github/base.py +21 -0
  193. intentkit/skills/github/github.jpg +0 -0
  194. intentkit/skills/github/github_search.py +183 -0
  195. intentkit/skills/github/schema.json +59 -0
  196. intentkit/skills/heurist/__init__.py +143 -0
  197. intentkit/skills/heurist/base.py +26 -0
  198. intentkit/skills/heurist/heurist.png +0 -0
  199. intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
  200. intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
  201. intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
  202. intentkit/skills/heurist/image_generation_braindance.py +162 -0
  203. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
  204. intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
  205. intentkit/skills/heurist/image_generation_sdxl.py +161 -0
  206. intentkit/skills/heurist/schema.json +196 -0
  207. intentkit/skills/lifi/README.md +294 -0
  208. intentkit/skills/lifi/__init__.py +141 -0
  209. intentkit/skills/lifi/base.py +21 -0
  210. intentkit/skills/lifi/lifi.png +0 -0
  211. intentkit/skills/lifi/schema.json +89 -0
  212. intentkit/skills/lifi/token_execute.py +472 -0
  213. intentkit/skills/lifi/token_quote.py +190 -0
  214. intentkit/skills/lifi/utils.py +656 -0
  215. intentkit/skills/moralis/README.md +490 -0
  216. intentkit/skills/moralis/__init__.py +110 -0
  217. intentkit/skills/moralis/api.py +281 -0
  218. intentkit/skills/moralis/base.py +55 -0
  219. intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
  220. intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
  221. intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
  222. intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
  223. intentkit/skills/moralis/moralis.png +0 -0
  224. intentkit/skills/moralis/schema.json +156 -0
  225. intentkit/skills/moralis/tests/__init__.py +0 -0
  226. intentkit/skills/moralis/tests/test_wallet.py +511 -0
  227. intentkit/skills/nation/__init__.py +62 -0
  228. intentkit/skills/nation/base.py +31 -0
  229. intentkit/skills/nation/nation.png +0 -0
  230. intentkit/skills/nation/nft_check.py +106 -0
  231. intentkit/skills/nation/schema.json +58 -0
  232. intentkit/skills/openai/__init__.py +107 -0
  233. intentkit/skills/openai/base.py +32 -0
  234. intentkit/skills/openai/dalle_image_generation.py +128 -0
  235. intentkit/skills/openai/gpt_image_generation.py +152 -0
  236. intentkit/skills/openai/gpt_image_to_image.py +186 -0
  237. intentkit/skills/openai/image_to_text.py +126 -0
  238. intentkit/skills/openai/openai.png +0 -0
  239. intentkit/skills/openai/schema.json +139 -0
  240. intentkit/skills/portfolio/README.md +55 -0
  241. intentkit/skills/portfolio/__init__.py +151 -0
  242. intentkit/skills/portfolio/base.py +107 -0
  243. intentkit/skills/portfolio/constants.py +9 -0
  244. intentkit/skills/portfolio/moralis.png +0 -0
  245. intentkit/skills/portfolio/schema.json +237 -0
  246. intentkit/skills/portfolio/token_balances.py +155 -0
  247. intentkit/skills/portfolio/wallet_approvals.py +102 -0
  248. intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
  249. intentkit/skills/portfolio/wallet_history.py +155 -0
  250. intentkit/skills/portfolio/wallet_net_worth.py +112 -0
  251. intentkit/skills/portfolio/wallet_nfts.py +139 -0
  252. intentkit/skills/portfolio/wallet_profitability.py +101 -0
  253. intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
  254. intentkit/skills/portfolio/wallet_stats.py +79 -0
  255. intentkit/skills/portfolio/wallet_swaps.py +147 -0
  256. intentkit/skills/skills.toml +103 -0
  257. intentkit/skills/slack/__init__.py +98 -0
  258. intentkit/skills/slack/base.py +55 -0
  259. intentkit/skills/slack/get_channel.py +109 -0
  260. intentkit/skills/slack/get_message.py +136 -0
  261. intentkit/skills/slack/schedule_message.py +92 -0
  262. intentkit/skills/slack/schema.json +135 -0
  263. intentkit/skills/slack/send_message.py +81 -0
  264. intentkit/skills/slack/slack.jpg +0 -0
  265. intentkit/skills/system/__init__.py +90 -0
  266. intentkit/skills/system/base.py +22 -0
  267. intentkit/skills/system/read_agent_api_key.py +87 -0
  268. intentkit/skills/system/regenerate_agent_api_key.py +77 -0
  269. intentkit/skills/system/schema.json +53 -0
  270. intentkit/skills/system/system.svg +76 -0
  271. intentkit/skills/tavily/README.md +86 -0
  272. intentkit/skills/tavily/__init__.py +91 -0
  273. intentkit/skills/tavily/base.py +27 -0
  274. intentkit/skills/tavily/schema.json +119 -0
  275. intentkit/skills/tavily/tavily.jpg +0 -0
  276. intentkit/skills/tavily/tavily_extract.py +147 -0
  277. intentkit/skills/tavily/tavily_search.py +139 -0
  278. intentkit/skills/token/README.md +89 -0
  279. intentkit/skills/token/__init__.py +107 -0
  280. intentkit/skills/token/base.py +154 -0
  281. intentkit/skills/token/constants.py +9 -0
  282. intentkit/skills/token/erc20_transfers.py +145 -0
  283. intentkit/skills/token/moralis.png +0 -0
  284. intentkit/skills/token/schema.json +141 -0
  285. intentkit/skills/token/token_analytics.py +81 -0
  286. intentkit/skills/token/token_price.py +132 -0
  287. intentkit/skills/token/token_search.py +121 -0
  288. intentkit/skills/twitter/__init__.py +146 -0
  289. intentkit/skills/twitter/base.py +68 -0
  290. intentkit/skills/twitter/follow_user.py +69 -0
  291. intentkit/skills/twitter/get_mentions.py +124 -0
  292. intentkit/skills/twitter/get_timeline.py +111 -0
  293. intentkit/skills/twitter/get_user_by_username.py +84 -0
  294. intentkit/skills/twitter/get_user_tweets.py +123 -0
  295. intentkit/skills/twitter/like_tweet.py +65 -0
  296. intentkit/skills/twitter/post_tweet.py +90 -0
  297. intentkit/skills/twitter/reply_tweet.py +98 -0
  298. intentkit/skills/twitter/retweet.py +76 -0
  299. intentkit/skills/twitter/schema.json +258 -0
  300. intentkit/skills/twitter/search_tweets.py +115 -0
  301. intentkit/skills/twitter/twitter.png +0 -0
  302. intentkit/skills/unrealspeech/__init__.py +55 -0
  303. intentkit/skills/unrealspeech/base.py +21 -0
  304. intentkit/skills/unrealspeech/schema.json +100 -0
  305. intentkit/skills/unrealspeech/text_to_speech.py +177 -0
  306. intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
  307. intentkit/skills/venice_audio/__init__.py +106 -0
  308. intentkit/skills/venice_audio/base.py +119 -0
  309. intentkit/skills/venice_audio/input.py +41 -0
  310. intentkit/skills/venice_audio/schema.json +152 -0
  311. intentkit/skills/venice_audio/venice_audio.py +240 -0
  312. intentkit/skills/venice_audio/venice_logo.jpg +0 -0
  313. intentkit/skills/venice_image/README.md +119 -0
  314. intentkit/skills/venice_image/__init__.py +154 -0
  315. intentkit/skills/venice_image/api.py +138 -0
  316. intentkit/skills/venice_image/base.py +188 -0
  317. intentkit/skills/venice_image/config.py +35 -0
  318. intentkit/skills/venice_image/image_enhance/README.md +119 -0
  319. intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
  320. intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
  321. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
  322. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
  323. intentkit/skills/venice_image/image_generation/README.md +144 -0
  324. intentkit/skills/venice_image/image_generation/__init__.py +0 -0
  325. intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
  326. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
  328. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
  329. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
  330. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
  331. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
  332. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
  333. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
  334. intentkit/skills/venice_image/image_upscale/README.md +111 -0
  335. intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
  336. intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
  337. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
  338. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
  339. intentkit/skills/venice_image/image_vision/README.md +112 -0
  340. intentkit/skills/venice_image/image_vision/__init__.py +0 -0
  341. intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
  342. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
  343. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
  344. intentkit/skills/venice_image/schema.json +267 -0
  345. intentkit/skills/venice_image/utils.py +78 -0
  346. intentkit/skills/venice_image/venice_image.jpg +0 -0
  347. intentkit/skills/web_scraper/README.md +82 -0
  348. intentkit/skills/web_scraper/__init__.py +92 -0
  349. intentkit/skills/web_scraper/base.py +21 -0
  350. intentkit/skills/web_scraper/langchain.png +0 -0
  351. intentkit/skills/web_scraper/schema.json +115 -0
  352. intentkit/skills/web_scraper/scrape_and_index.py +327 -0
  353. intentkit/utils/__init__.py +1 -0
  354. intentkit/utils/chain.py +436 -0
  355. intentkit/utils/error.py +134 -0
  356. intentkit/utils/logging.py +70 -0
  357. intentkit/utils/middleware.py +61 -0
  358. intentkit/utils/random.py +16 -0
  359. intentkit/utils/s3.py +267 -0
  360. intentkit/utils/slack_alert.py +79 -0
  361. intentkit/utils/tx.py +37 -0
  362. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
  363. intentkit-0.5.2.dist-info/RECORD +365 -0
  364. intentkit-0.5.0.dist-info/RECORD +0 -4
  365. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
  366. {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,155 @@
1
+ import logging
2
+ from typing import Any, Dict, Optional, Type
3
+
4
+ from langchain_core.runnables import RunnableConfig
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.skills.portfolio.base import PortfolioBaseTool
8
+ from intentkit.skills.portfolio.constants import (
9
+ DEFAULT_CHAIN,
10
+ DEFAULT_LIMIT,
11
+ DEFAULT_ORDER,
12
+ )
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class WalletHistoryInput(BaseModel):
18
+ """Input for wallet transaction history tool."""
19
+
20
+ address: str = Field(
21
+ description="The address of the wallet to get transaction history for."
22
+ )
23
+ chain: str = Field(
24
+ description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
25
+ default=DEFAULT_CHAIN,
26
+ )
27
+ limit: Optional[int] = Field(
28
+ description="The desired page size of the result.",
29
+ default=DEFAULT_LIMIT,
30
+ )
31
+ cursor: Optional[str] = Field(
32
+ description="The cursor returned in the previous response (for pagination).",
33
+ default=None,
34
+ )
35
+ from_block: Optional[int] = Field(
36
+ description="The minimum block number to get transactions from.",
37
+ default=None,
38
+ )
39
+ to_block: Optional[int] = Field(
40
+ description="The maximum block number to get transactions from.",
41
+ default=None,
42
+ )
43
+ from_date: Optional[str] = Field(
44
+ description="The start date to get transactions from (format in seconds or datestring).",
45
+ default=None,
46
+ )
47
+ to_date: Optional[str] = Field(
48
+ description="The end date to get transactions from (format in seconds or datestring).",
49
+ default=None,
50
+ )
51
+ include_internal_transactions: Optional[bool] = Field(
52
+ description="If the result should contain the internal transactions.",
53
+ default=None,
54
+ )
55
+ nft_metadata: Optional[bool] = Field(
56
+ description="If the result should contain the NFT metadata.",
57
+ default=None,
58
+ )
59
+ order: Optional[str] = Field(
60
+ description="The order of the result, in ascending (ASC) or descending (DESC).",
61
+ default=DEFAULT_ORDER,
62
+ )
63
+
64
+
65
+ class WalletHistory(PortfolioBaseTool):
66
+ """Tool for retrieving wallet transaction history using Moralis.
67
+
68
+ This tool uses Moralis' API to fetch the full transaction history of a specified wallet address,
69
+ including sends, receives, token and NFT transfers, and contract interactions.
70
+ """
71
+
72
+ name: str = "portfolio_wallet_history"
73
+ description: str = (
74
+ "Retrieve the full transaction history of a specified wallet address, including sends, "
75
+ "receives, token and NFT transfers, and contract interactions."
76
+ )
77
+ args_schema: Type[BaseModel] = WalletHistoryInput
78
+
79
+ async def _arun(
80
+ self,
81
+ address: str,
82
+ chain: str = DEFAULT_CHAIN,
83
+ limit: Optional[int] = DEFAULT_LIMIT,
84
+ cursor: Optional[str] = None,
85
+ from_block: Optional[int] = None,
86
+ to_block: Optional[int] = None,
87
+ from_date: Optional[str] = None,
88
+ to_date: Optional[str] = None,
89
+ include_internal_transactions: Optional[bool] = None,
90
+ nft_metadata: Optional[bool] = None,
91
+ order: Optional[str] = DEFAULT_ORDER,
92
+ config: RunnableConfig = None,
93
+ **kwargs,
94
+ ) -> Dict[str, Any]:
95
+ """Fetch wallet transaction history from Moralis.
96
+
97
+ Args:
98
+ address: The wallet address to get history for
99
+ chain: The blockchain to query
100
+ limit: Number of results per page
101
+ cursor: Pagination cursor
102
+ from_block: Minimum block number
103
+ to_block: Maximum block number
104
+ from_date: Start date for transactions
105
+ to_date: End date for transactions
106
+ include_internal_transactions: Include internal txs
107
+ nft_metadata: Include NFT metadata
108
+ order: Order of results (ASC/DESC)
109
+ config: The configuration for the tool call
110
+
111
+ Returns:
112
+ Dict containing transaction history data
113
+ """
114
+ context = self.context_from_config(config)
115
+ logger.debug(
116
+ f"wallet_history.py: Fetching wallet history with context {context}"
117
+ )
118
+
119
+ # Get the API key from the agent's configuration
120
+ api_key = self.get_api_key(context)
121
+ if not api_key:
122
+ return {"error": "No Moralis API key provided in the configuration."}
123
+
124
+ # Build query parameters
125
+ params = {"chain": chain, "limit": limit, "order": order}
126
+
127
+ # Add optional parameters if they exist
128
+ if cursor:
129
+ params["cursor"] = cursor
130
+ if from_block:
131
+ params["from_block"] = from_block
132
+ if to_block:
133
+ params["to_block"] = to_block
134
+ if from_date:
135
+ params["from_date"] = from_date
136
+ if to_date:
137
+ params["to_date"] = to_date
138
+ if include_internal_transactions is not None:
139
+ params["include_internal_transactions"] = include_internal_transactions
140
+ if nft_metadata is not None:
141
+ params["nft_metadata"] = nft_metadata
142
+
143
+ # Call Moralis API
144
+ try:
145
+ endpoint = f"/wallets/{address}/history"
146
+ return await self._make_request(
147
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
148
+ )
149
+ except Exception as e:
150
+ logger.error(
151
+ f"wallet_history.py: Error fetching wallet history: {e}", exc_info=True
152
+ )
153
+ return {
154
+ "error": "An error occurred while fetching wallet history. Please try again later."
155
+ }
@@ -0,0 +1,112 @@
1
+ import logging
2
+ from typing import Any, Dict, List, Optional, Type
3
+
4
+ from langchain_core.runnables import RunnableConfig
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.skills.portfolio.base import PortfolioBaseTool
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class WalletNetWorthInput(BaseModel):
13
+ """Input for wallet net worth tool."""
14
+
15
+ address: str = Field(description="The wallet address to calculate net worth for.")
16
+ chains: Optional[List[str]] = Field(
17
+ description="The chains to query (e.g., ['eth', 'bsc', 'polygon']).",
18
+ default=None,
19
+ )
20
+ exclude_spam: Optional[bool] = Field(
21
+ description="Exclude spam tokens from the result.",
22
+ default=True,
23
+ )
24
+ exclude_unverified_contracts: Optional[bool] = Field(
25
+ description="Exclude unverified contracts from the result.",
26
+ default=True,
27
+ )
28
+ max_token_inactivity: Optional[int] = Field(
29
+ description="Exclude tokens inactive for more than the given amount of days.",
30
+ default=1,
31
+ )
32
+ min_pair_side_liquidity_usd: Optional[float] = Field(
33
+ description="Exclude tokens with liquidity less than the specified amount in USD.",
34
+ default=1000,
35
+ )
36
+
37
+
38
+ class WalletNetWorth(PortfolioBaseTool):
39
+ """Tool for calculating a wallet's total net worth using Moralis.
40
+
41
+ This tool uses Moralis' API to calculate the net worth of a wallet in USD across
42
+ multiple chains, with options to filter out spam and low-liquidity tokens.
43
+ """
44
+
45
+ name: str = "portfolio_wallet_net_worth"
46
+ description: str = (
47
+ "Get the net worth of a wallet in USD across multiple chains. "
48
+ "Filters out spam tokens and low-liquidity assets for more accurate results."
49
+ )
50
+ args_schema: Type[BaseModel] = WalletNetWorthInput
51
+
52
+ async def _arun(
53
+ self,
54
+ address: str,
55
+ chains: Optional[List[str]] = None,
56
+ exclude_spam: Optional[bool] = True,
57
+ exclude_unverified_contracts: Optional[bool] = True,
58
+ max_token_inactivity: Optional[int] = 1,
59
+ min_pair_side_liquidity_usd: Optional[float] = 1000,
60
+ config: RunnableConfig = None,
61
+ **kwargs,
62
+ ) -> Dict[str, Any]:
63
+ """Calculate wallet net worth from Moralis.
64
+
65
+ Args:
66
+ address: The wallet address to calculate net worth for
67
+ chains: List of chains to query
68
+ exclude_spam: Whether to exclude spam tokens
69
+ exclude_unverified_contracts: Whether to exclude unverified contracts
70
+ max_token_inactivity: Exclude tokens inactive for more than the given days
71
+ min_pair_side_liquidity_usd: Exclude tokens with liquidity less than specified
72
+ config: The configuration for the tool call
73
+
74
+ Returns:
75
+ Dict containing wallet net worth data
76
+ """
77
+ context = self.context_from_config(config)
78
+ logger.debug(
79
+ f"wallet_net_worth.py: Calculating wallet net worth with context {context}"
80
+ )
81
+
82
+ # Get the API key from the agent's configuration
83
+ api_key = self.get_api_key(context)
84
+ if not api_key:
85
+ return {"error": "No Moralis API key provided in the configuration."}
86
+
87
+ # Build query parameters
88
+ params = {
89
+ "exclude_spam": exclude_spam,
90
+ "exclude_unverified_contracts": exclude_unverified_contracts,
91
+ "max_token_inactivity": max_token_inactivity,
92
+ "min_pair_side_liquidity_usd": min_pair_side_liquidity_usd,
93
+ }
94
+
95
+ # Add chains if specified
96
+ if chains:
97
+ params["chains"] = chains
98
+
99
+ # Call Moralis API
100
+ try:
101
+ endpoint = f"/wallets/{address}/net-worth"
102
+ return await self._make_request(
103
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
104
+ )
105
+ except Exception as e:
106
+ logger.error(
107
+ f"wallet_net_worth.py: Error calculating wallet net worth: {e}",
108
+ exc_info=True,
109
+ )
110
+ return {
111
+ "error": "An error occurred while calculating wallet net worth. Please try again later."
112
+ }
@@ -0,0 +1,139 @@
1
+ import logging
2
+ from typing import Any, Dict, List, Optional, Type
3
+
4
+ from langchain_core.runnables import RunnableConfig
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.skills.portfolio.base import PortfolioBaseTool
8
+ from intentkit.skills.portfolio.constants import DEFAULT_CHAIN, DEFAULT_LIMIT
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class WalletNFTsInput(BaseModel):
14
+ """Input for wallet NFTs tool."""
15
+
16
+ address: str = Field(description="The address of the wallet to get NFTs for.")
17
+ chain: str = Field(
18
+ description="The chain to query (e.g., 'eth', 'base', 'polygon').",
19
+ default=DEFAULT_CHAIN,
20
+ )
21
+ format: Optional[str] = Field(
22
+ description="The format of the token ID ('decimal' or 'hex').",
23
+ default="decimal",
24
+ )
25
+ limit: Optional[int] = Field(
26
+ description="The desired page size of the result.",
27
+ default=DEFAULT_LIMIT,
28
+ )
29
+ exclude_spam: Optional[bool] = Field(
30
+ description="Should spam NFTs be excluded from the result?",
31
+ default=True,
32
+ )
33
+ token_addresses: Optional[List[str]] = Field(
34
+ description="The non-fungible token (NFT) addresses to get balances for.",
35
+ default=None,
36
+ )
37
+ cursor: Optional[str] = Field(
38
+ description="The cursor returned in the previous response (for pagination).",
39
+ default=None,
40
+ )
41
+ normalize_metadata: Optional[bool] = Field(
42
+ description="The option to enable metadata normalization.",
43
+ default=True,
44
+ )
45
+ media_items: Optional[bool] = Field(
46
+ description="Should preview media data be returned?",
47
+ default=False,
48
+ )
49
+ include_prices: Optional[bool] = Field(
50
+ description="Should NFT last sale prices be included in the result?",
51
+ default=False,
52
+ )
53
+
54
+
55
+ class WalletNFTs(PortfolioBaseTool):
56
+ """Tool for retrieving NFTs owned by a wallet using Moralis.
57
+
58
+ This tool uses Moralis' API to fetch NFTs owned by a given address, with options
59
+ to filter and format the results.
60
+ """
61
+
62
+ name: str = "portfolio_wallet_nfts"
63
+ description: str = (
64
+ "Get NFTs owned by a given wallet address. Results include token details, "
65
+ "metadata, collection information, and optionally prices."
66
+ )
67
+ args_schema: Type[BaseModel] = WalletNFTsInput
68
+
69
+ async def _arun(
70
+ self,
71
+ address: str,
72
+ chain: str = DEFAULT_CHAIN,
73
+ format: Optional[str] = "decimal",
74
+ limit: Optional[int] = DEFAULT_LIMIT,
75
+ exclude_spam: Optional[bool] = True,
76
+ token_addresses: Optional[List[str]] = None,
77
+ cursor: Optional[str] = None,
78
+ normalize_metadata: Optional[bool] = True,
79
+ media_items: Optional[bool] = False,
80
+ include_prices: Optional[bool] = False,
81
+ config: RunnableConfig = None,
82
+ **kwargs,
83
+ ) -> Dict[str, Any]:
84
+ """Fetch NFTs owned by a wallet from Moralis.
85
+
86
+ Args:
87
+ address: The wallet address
88
+ chain: The blockchain to query
89
+ format: The format of the token ID ('decimal' or 'hex')
90
+ limit: Number of results per page
91
+ exclude_spam: Whether to exclude spam NFTs
92
+ token_addresses: Specific NFT contracts to filter by
93
+ cursor: Pagination cursor
94
+ normalize_metadata: Enable metadata normalization
95
+ media_items: Include preview media data
96
+ include_prices: Include NFT last sale prices
97
+ config: The configuration for the tool call
98
+
99
+ Returns:
100
+ Dict containing wallet NFTs data
101
+ """
102
+ context = self.context_from_config(config)
103
+ logger.debug(f"wallet_nfts.py: Fetching wallet NFTs with context {context}")
104
+
105
+ # Get the API key from the agent's configuration
106
+ api_key = self.get_api_key(context)
107
+ if not api_key:
108
+ return {"error": "No Moralis API key provided in the configuration."}
109
+
110
+ # Build query parameters
111
+ params = {
112
+ "chain": chain,
113
+ "format": format,
114
+ "limit": limit,
115
+ "exclude_spam": exclude_spam,
116
+ "normalizeMetadata": normalize_metadata,
117
+ "media_items": media_items,
118
+ "include_prices": include_prices,
119
+ }
120
+
121
+ # Add optional parameters if they exist
122
+ if token_addresses:
123
+ params["token_addresses"] = token_addresses
124
+ if cursor:
125
+ params["cursor"] = cursor
126
+
127
+ # Call Moralis API
128
+ try:
129
+ endpoint = f"/{address}/nft"
130
+ return await self._make_request(
131
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
132
+ )
133
+ except Exception as e:
134
+ logger.error(
135
+ f"wallet_nfts.py: Error fetching wallet NFTs: {e}", exc_info=True
136
+ )
137
+ return {
138
+ "error": "An error occurred while fetching wallet NFTs. Please try again later."
139
+ }
@@ -0,0 +1,101 @@
1
+ import logging
2
+ from typing import Any, Dict, List, Optional, Type
3
+
4
+ from langchain_core.runnables import RunnableConfig
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.skills.portfolio.base import PortfolioBaseTool
8
+ from intentkit.skills.portfolio.constants import DEFAULT_CHAIN
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class WalletProfitabilityInput(BaseModel):
14
+ """Input for wallet profitability breakdown tool."""
15
+
16
+ address: str = Field(
17
+ description="The wallet address to get profitability breakdown for."
18
+ )
19
+ chain: str = Field(
20
+ description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
21
+ default=DEFAULT_CHAIN,
22
+ )
23
+ days: Optional[str] = Field(
24
+ description="Timeframe in days for which profitability is calculated. Options: 'all', '7', '30', '60', '90'.",
25
+ default="all",
26
+ )
27
+ token_addresses: Optional[List[str]] = Field(
28
+ description="The token addresses list to filter the result with.",
29
+ default=None,
30
+ )
31
+
32
+
33
+ class WalletProfitability(PortfolioBaseTool):
34
+ """Tool for retrieving detailed wallet profitability breakdown using Moralis.
35
+
36
+ This tool uses Moralis' API to retrieve detailed profitability information for a
37
+ specific wallet address, with the option to filter by one or more tokens.
38
+ """
39
+
40
+ name: str = "portfolio_wallet_profitability"
41
+ description: str = (
42
+ "Retrieve detailed profitability breakdown for a wallet, including profit/loss per token, "
43
+ "average buy/sell prices, and realized profits. Can be filtered by specific tokens."
44
+ )
45
+ args_schema: Type[BaseModel] = WalletProfitabilityInput
46
+
47
+ async def _arun(
48
+ self,
49
+ address: str,
50
+ chain: str = DEFAULT_CHAIN,
51
+ days: Optional[str] = "all",
52
+ token_addresses: Optional[List[str]] = None,
53
+ config: RunnableConfig = None,
54
+ **kwargs,
55
+ ) -> Dict[str, Any]:
56
+ """Fetch detailed wallet profitability from Moralis.
57
+
58
+ Args:
59
+ address: The wallet address to get profitability for
60
+ chain: The blockchain to query
61
+ days: Timeframe in days for the profitability data
62
+ token_addresses: List of token addresses to filter results
63
+ config: The configuration for the tool call
64
+
65
+ Returns:
66
+ Dict containing wallet profitability breakdown data
67
+ """
68
+ context = self.context_from_config(config)
69
+ logger.debug(
70
+ f"wallet_profitability.py: Fetching profitability breakdown with context {context}"
71
+ )
72
+
73
+ # Get the API key from the agent's configuration
74
+ api_key = self.get_api_key(context)
75
+ if not api_key:
76
+ return {"error": "No Moralis API key provided in the configuration."}
77
+
78
+ # Build query parameters
79
+ params = {
80
+ "chain": chain,
81
+ "days": days,
82
+ }
83
+
84
+ # Add token_addresses if specified
85
+ if token_addresses:
86
+ params["token_addresses"] = token_addresses
87
+
88
+ # Call Moralis API
89
+ try:
90
+ endpoint = f"/wallets/{address}/profitability"
91
+ return await self._make_request(
92
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
93
+ )
94
+ except Exception as e:
95
+ logger.error(
96
+ f"wallet_profitability.py: Error fetching profitability breakdown: {e}",
97
+ exc_info=True,
98
+ )
99
+ return {
100
+ "error": "An error occurred while fetching profitability breakdown. Please try again later."
101
+ }
@@ -0,0 +1,91 @@
1
+ import logging
2
+ from typing import Any, Dict, Optional, Type
3
+
4
+ from langchain_core.runnables import RunnableConfig
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.skills.portfolio.base import PortfolioBaseTool
8
+ from intentkit.skills.portfolio.constants import DEFAULT_CHAIN
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class WalletProfitabilitySummaryInput(BaseModel):
14
+ """Input for wallet profitability summary tool."""
15
+
16
+ address: str = Field(
17
+ description="The wallet address to get profitability summary for."
18
+ )
19
+ chain: str = Field(
20
+ description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
21
+ default=DEFAULT_CHAIN,
22
+ )
23
+ days: Optional[str] = Field(
24
+ description="Timeframe in days for the profitability summary. Options: 'all', '7', '30', '60', '90'.",
25
+ default="all",
26
+ )
27
+
28
+
29
+ class WalletProfitabilitySummary(PortfolioBaseTool):
30
+ """Tool for retrieving wallet profitability summary using Moralis.
31
+
32
+ This tool uses Moralis' API to retrieve a summary of wallet profitability
33
+ based on specified parameters.
34
+ """
35
+
36
+ name: str = "portfolio_wallet_profitability_summary"
37
+ description: str = (
38
+ "Retrieve a summary of wallet profitability including total profit/loss, "
39
+ "trade volume, and other metrics. Filter by time period."
40
+ )
41
+ args_schema: Type[BaseModel] = WalletProfitabilitySummaryInput
42
+
43
+ async def _arun(
44
+ self,
45
+ address: str,
46
+ chain: str = DEFAULT_CHAIN,
47
+ days: Optional[str] = "all",
48
+ config: RunnableConfig = None,
49
+ **kwargs,
50
+ ) -> Dict[str, Any]:
51
+ """Fetch wallet profitability summary from Moralis.
52
+
53
+ Args:
54
+ address: The wallet address to get profitability for
55
+ chain: The blockchain to query
56
+ days: Timeframe in days for the summary
57
+ config: The configuration for the tool call
58
+
59
+ Returns:
60
+ Dict containing wallet profitability summary data
61
+ """
62
+ context = self.context_from_config(config)
63
+ logger.debug(
64
+ f"wallet_profitability_summary.py: Fetching profitability summary with context {context}"
65
+ )
66
+
67
+ # Get the API key from the agent's configuration
68
+ api_key = self.get_api_key(context)
69
+ if not api_key:
70
+ return {"error": "No Moralis API key provided in the configuration."}
71
+
72
+ # Build query parameters
73
+ params = {
74
+ "chain": chain,
75
+ "days": days,
76
+ }
77
+
78
+ # Call Moralis API
79
+ try:
80
+ endpoint = f"/wallets/{address}/profitability/summary"
81
+ return await self._make_request(
82
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
83
+ )
84
+ except Exception as e:
85
+ logger.error(
86
+ f"wallet_profitability_summary.py: Error fetching profitability summary: {e}",
87
+ exc_info=True,
88
+ )
89
+ return {
90
+ "error": "An error occurred while fetching profitability summary. Please try again later."
91
+ }
@@ -0,0 +1,79 @@
1
+ import logging
2
+ from typing import Any, Dict, Type
3
+
4
+ from langchain_core.runnables import RunnableConfig
5
+ from pydantic import BaseModel, Field
6
+
7
+ from intentkit.skills.portfolio.base import PortfolioBaseTool
8
+ from intentkit.skills.portfolio.constants import DEFAULT_CHAIN
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class WalletStatsInput(BaseModel):
14
+ """Input for wallet stats tool."""
15
+
16
+ address: str = Field(description="The wallet address to get stats for.")
17
+ chain: str = Field(
18
+ description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
19
+ default=DEFAULT_CHAIN,
20
+ )
21
+
22
+
23
+ class WalletStats(PortfolioBaseTool):
24
+ """Tool for retrieving wallet statistics using Moralis.
25
+
26
+ This tool uses Moralis' API to get high-level statistical information about
27
+ a wallet, including NFT counts, collection counts, and transaction counts.
28
+ """
29
+
30
+ name: str = "portfolio_wallet_stats"
31
+ description: str = (
32
+ "Get statistical information about a wallet, including the number of NFTs, "
33
+ "collections, and transaction counts."
34
+ )
35
+ args_schema: Type[BaseModel] = WalletStatsInput
36
+
37
+ async def _arun(
38
+ self,
39
+ address: str,
40
+ chain: str = DEFAULT_CHAIN,
41
+ config: RunnableConfig = None,
42
+ **kwargs,
43
+ ) -> Dict[str, Any]:
44
+ """Fetch wallet stats from Moralis.
45
+
46
+ Args:
47
+ address: The wallet address to get stats for
48
+ chain: The blockchain to query
49
+ config: The configuration for the tool call
50
+
51
+ Returns:
52
+ Dict containing wallet stats data
53
+ """
54
+ context = self.context_from_config(config)
55
+ logger.debug(f"wallet_stats.py: Fetching wallet stats with context {context}")
56
+
57
+ # Get the API key from the agent's configuration
58
+ api_key = self.get_api_key(context)
59
+ if not api_key:
60
+ return {"error": "No Moralis API key provided in the configuration."}
61
+
62
+ # Build query parameters
63
+ params = {
64
+ "chain": chain,
65
+ }
66
+
67
+ # Call Moralis API
68
+ try:
69
+ endpoint = f"/wallets/{address}/stats"
70
+ return await self._make_request(
71
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
72
+ )
73
+ except Exception as e:
74
+ logger.error(
75
+ f"wallet_stats.py: Error fetching wallet stats: {e}", exc_info=True
76
+ )
77
+ return {
78
+ "error": "An error occurred while fetching wallet stats. Please try again later."
79
+ }