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,89 @@
1
+ # Token Skills
2
+
3
+ The Token skills provide blockchain token analytics capabilities powered by Moralis. These skills allow you to search, analyze, and track token information across multiple blockchains.
4
+
5
+ ## Available Skills
6
+
7
+ | Skill | Description | Endpoint | Example Prompts |
8
+ |-------|-------------|----------|----------------|
9
+ | `token_price` | Get token price and information | `GET /erc20/:address/price` | "What's the current price of PEPE token?" "Get the price of USDT on Ethereum." |
10
+ | `token_erc20_transfers` | Get ERC20 token transfers for a wallet | `GET /:address/erc20/transfers` | "Show me all the USDT transfers for my wallet." "What are the recent token transactions for 0x123?" |
11
+ | `token_search` * | Search for tokens by name, symbol, or address | `GET /tokens/search` | "Find tokens with 'pepe' in the name." "Search for tokens with high market cap on Ethereum." |
12
+ | `token_analytics` | Get detailed analytics for a token | `GET /tokens/:address/analytics` | "Show me analytics for the PEPE token." "What are the buy/sell volumes for USDT in the last 24 hours?" |
13
+
14
+ \* Premium Endpoint: To use the `token_search` API, you will need an API key associated with a Moralis account on the Business plan or a custom Enterprise plan.
15
+
16
+ ## Configuration
17
+
18
+ The token skills require a Moralis API key to function. You can configure this in your agent's configuration file:
19
+
20
+ ```yaml
21
+ skills:
22
+ token:
23
+ api_key: "your_moralis_api_key_here"
24
+ states:
25
+ token_price: "public"
26
+ token_erc20_transfers: "public"
27
+ token_search: "public"
28
+ token_analytics: "public"
29
+ ```
30
+
31
+ ## Responses
32
+
33
+ All token skills return structured data from the Moralis API. Here are the typical response formats:
34
+
35
+ ### Token Price
36
+
37
+ ```json
38
+ {
39
+ "tokenName": "Pepe",
40
+ "tokenSymbol": "PEPE",
41
+ "tokenLogo": "https://cdn.moralis.io/eth/0x6982508145454ce325ddbe47a25d4ec3d2311933.png",
42
+ "tokenDecimals": "18",
43
+ "usdPrice": 0.000012302426023896,
44
+ "usdPriceFormatted": "0.000012302426023896",
45
+ "24hrPercentChange": "-3.7369101031758394",
46
+ "exchangeName": "Uniswap v3",
47
+ "tokenAddress": "0x6982508145454ce325ddbe47a25d4ec3d2311933"
48
+ }
49
+ ```
50
+
51
+ ### Token Analytics
52
+
53
+ ```json
54
+ {
55
+ "tokenAddress": "0x6982508145454ce325ddbe47a25d4ec3d2311933",
56
+ "totalBuyVolume": {
57
+ "5m": "",
58
+ "1h": 43678.642005116264,
59
+ "6h": 129974.13379912674,
60
+ "24h": 4583254.969119737
61
+ },
62
+ "totalSellVolume": {
63
+ "5m": 147.69184595604904,
64
+ "1h": 393.0296489666009,
65
+ "6h": 257421.35479601548,
66
+ "24h": 4735908.689740969
67
+ },
68
+ "totalBuyers": {
69
+ "5m": "",
70
+ "1h": 33,
71
+ "6h": 115,
72
+ "24h": 547
73
+ },
74
+ "totalSellers": {
75
+ "5m": 1,
76
+ "1h": 2,
77
+ "6h": 78,
78
+ "24h": 587
79
+ }
80
+ }
81
+ ```
82
+
83
+ ## Usage Tips
84
+
85
+ - For the best performance, always specify the chain parameter when querying across multiple blockchains.
86
+ - When using the token_search endpoint, be aware of your Moralis plan limitations.
87
+ - The token analytics skill provides valuable trading data that can be used for token analysis and market assessment.
88
+
89
+ For more detailed information on each endpoint, refer to the [Moralis API documentation](https://docs.moralis.io/web3-data-api/evm).
@@ -0,0 +1,107 @@
1
+ """Token skills for blockchain token analysis."""
2
+
3
+ import logging
4
+ from typing import TypedDict
5
+
6
+ from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.skills.base import SkillConfig, SkillState
8
+ from intentkit.skills.token.base import TokenBaseTool
9
+ from intentkit.skills.token.erc20_transfers import ERC20Transfers
10
+ from intentkit.skills.token.token_analytics import TokenAnalytics
11
+ from intentkit.skills.token.token_price import TokenPrice
12
+ from intentkit.skills.token.token_search import TokenSearch
13
+
14
+ # Cache skills at the system level, because they are stateless
15
+ _cache: dict[str, TokenBaseTool] = {}
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class SkillStates(TypedDict):
21
+ """State configurations for Token skills."""
22
+
23
+ token_price: SkillState
24
+ token_erc20_transfers: SkillState
25
+ token_search: SkillState
26
+ token_analytics: SkillState
27
+
28
+
29
+ class Config(SkillConfig):
30
+ """Configuration for Token blockchain analysis skills."""
31
+
32
+ states: SkillStates
33
+ api_key: str
34
+
35
+
36
+ async def get_skills(
37
+ config: "Config",
38
+ is_private: bool,
39
+ store: SkillStoreABC,
40
+ **_,
41
+ ) -> list[TokenBaseTool]:
42
+ """Get all Token blockchain analysis skills.
43
+
44
+ Args:
45
+ config: The configuration for Token skills.
46
+ is_private: Whether to include private skills.
47
+ store: The skill store for persisting data.
48
+
49
+ Returns:
50
+ A list of Token blockchain analysis skills.
51
+ """
52
+ if "states" not in config:
53
+ logger.error("No 'states' field in config")
54
+ return []
55
+
56
+ available_skills = []
57
+
58
+ # Include skills based on their state
59
+ for skill_name, state in config["states"].items():
60
+ if state == "disabled":
61
+ continue
62
+ elif state == "public" or (state == "private" and is_private):
63
+ available_skills.append(skill_name)
64
+
65
+ # Get each skill using the cached getter
66
+ result = []
67
+ for name in available_skills:
68
+ skill = get_token_skill(name, store)
69
+ if skill:
70
+ result.append(skill)
71
+
72
+ return result
73
+
74
+
75
+ def get_token_skill(
76
+ name: str,
77
+ store: SkillStoreABC,
78
+ ) -> TokenBaseTool:
79
+ """Get a Token blockchain analysis skill by name.
80
+
81
+ Args:
82
+ name: The name of the skill to get
83
+ store: The skill store for persisting data
84
+
85
+ Returns:
86
+ The requested Token blockchain analysis skill
87
+ """
88
+ if name in _cache:
89
+ return _cache[name]
90
+
91
+ skill = None
92
+ if name == "token_price":
93
+ skill = TokenPrice(skill_store=store)
94
+ elif name == "token_erc20_transfers":
95
+ skill = ERC20Transfers(skill_store=store)
96
+ elif name == "token_search":
97
+ skill = TokenSearch(skill_store=store)
98
+ elif name == "token_analytics":
99
+ skill = TokenAnalytics(skill_store=store)
100
+ else:
101
+ logger.warning(f"Unknown Token skill: {name}")
102
+ return None
103
+
104
+ if skill:
105
+ _cache[name] = skill
106
+
107
+ return skill
@@ -0,0 +1,154 @@
1
+ """Base class for token-related skills."""
2
+
3
+ import logging
4
+ from typing import Any, Dict, Optional
5
+
6
+ import aiohttp
7
+ from langchain_core.runnables import RunnableConfig
8
+
9
+ from intentkit.abstracts.skill import SkillStoreABC
10
+ from intentkit.skills.base import IntentKitSkill, SkillContext
11
+ from intentkit.skills.token.constants import MORALIS_API_BASE_URL
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class TokenBaseTool(IntentKitSkill):
17
+ """Base class for all token-related skills.
18
+
19
+ This base class provides common functionality for token API interactions,
20
+ including making HTTP requests to the Moralis API.
21
+ """
22
+
23
+ def __init__(self, skill_store: SkillStoreABC = None):
24
+ """Initialize the token tool with a skill store."""
25
+ super().__init__(skill_store=skill_store)
26
+
27
+ @property
28
+ def category(self) -> str:
29
+ return "token"
30
+
31
+ def get_api_key(self, context: SkillContext) -> str:
32
+ """Get API key from agent config or system config.
33
+
34
+ Args:
35
+ context: The skill context containing the agent config
36
+
37
+ Returns:
38
+ The API key to use for API requests
39
+ """
40
+ skill_config = context.config
41
+ if skill_config.get("api_key_provider") == "agent_owner":
42
+ return skill_config.get("api_key")
43
+ return self.skill_store.get_system_config("moralis_api_key")
44
+
45
+ def context_from_config(self, config: Optional[RunnableConfig] = None) -> Any:
46
+ """Extract context from the runnable config."""
47
+ if not config:
48
+ logger.error("No config provided to context_from_config")
49
+ return None
50
+
51
+ if "configurable" not in config:
52
+ logger.error("'configurable' not in config")
53
+ return None
54
+
55
+ if "agent" not in config["configurable"]:
56
+ logger.error("'agent' not in config['configurable']")
57
+ return None
58
+
59
+ agent = config["configurable"].get("agent")
60
+ category_config = None
61
+
62
+ if agent.skills:
63
+ category_config = agent.skills.get(self.category)
64
+
65
+ if not category_config:
66
+ category_config = getattr(agent, self.category + "_config", {})
67
+
68
+ if not category_config:
69
+ category_config = {}
70
+
71
+ from intentkit.skills.base import SkillContext
72
+
73
+ context = SkillContext(
74
+ agent=agent,
75
+ config=category_config,
76
+ user_id=config["configurable"].get("user_id"),
77
+ entrypoint=config["configurable"].get("entrypoint"),
78
+ )
79
+
80
+ return context
81
+
82
+ def _prepare_params(self, params: Dict[str, Any]) -> Dict[str, Any]:
83
+ """Convert boolean values to lowercase strings for API compatibility.
84
+
85
+ Args:
86
+ params: Dictionary with query parameters that may contain boolean values
87
+
88
+ Returns:
89
+ Dictionary with boolean values converted to lowercase strings
90
+ """
91
+ if not params:
92
+ return params
93
+
94
+ result = {}
95
+ for key, value in params.items():
96
+ if isinstance(value, bool):
97
+ result[key] = str(value).lower()
98
+ else:
99
+ result[key] = value
100
+ return result
101
+
102
+ async def _make_request(
103
+ self,
104
+ method: str,
105
+ endpoint: str,
106
+ api_key: str,
107
+ params: Dict[str, Any] = None,
108
+ data: Dict[str, Any] = None,
109
+ ) -> Dict[str, Any]:
110
+ """Make a request to the Moralis API.
111
+
112
+ Args:
113
+ method: HTTP method (GET, POST, etc.)
114
+ endpoint: API endpoint (without base URL)
115
+ api_key: Moralis API key
116
+ params: Query parameters
117
+ data: Request body data for POST requests
118
+
119
+ Returns:
120
+ Response data as dictionary
121
+ """
122
+ url = f"{MORALIS_API_BASE_URL}{endpoint}"
123
+
124
+ if not api_key:
125
+ logger.error("API key is missing")
126
+ return {"error": "API key is missing"}
127
+
128
+ headers = {"accept": "application/json", "X-API-Key": api_key}
129
+ processed_params = self._prepare_params(params) if params else None
130
+
131
+ try:
132
+ async with aiohttp.ClientSession() as session:
133
+ async with session.request(
134
+ method=method,
135
+ url=url,
136
+ headers=headers,
137
+ params=processed_params,
138
+ json=data,
139
+ ) as response:
140
+ if response.status >= 400:
141
+ error_text = await response.text()
142
+ logger.error(f"API error {response.status}: {error_text}")
143
+ return {
144
+ "error": f"API error: {response.status}",
145
+ "details": error_text,
146
+ }
147
+
148
+ return await response.json()
149
+ except aiohttp.ClientError as e:
150
+ logger.error(f"HTTP error making request: {str(e)}")
151
+ return {"error": f"HTTP error: {str(e)}"}
152
+ except Exception as e:
153
+ logger.error(f"Unexpected error making request: {str(e)}")
154
+ return {"error": f"Unexpected error: {str(e)}"}
@@ -0,0 +1,9 @@
1
+ """Constants for the token skills module."""
2
+
3
+ # Base URLs
4
+ MORALIS_API_BASE_URL = "https://deep-index.moralis.io/api/v2.2"
5
+
6
+ # Default parameters
7
+ DEFAULT_CHAIN = "eth"
8
+ DEFAULT_LIMIT = 100
9
+ DEFAULT_ORDER = "DESC"
@@ -0,0 +1,145 @@
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.token.base import TokenBaseTool
8
+ from intentkit.skills.token.constants import DEFAULT_CHAIN, DEFAULT_LIMIT, DEFAULT_ORDER
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class ERC20TransfersInput(BaseModel):
14
+ """Input for ERC20 transfers tool."""
15
+
16
+ address: str = Field(
17
+ description="The address of the wallet to get ERC20 token transfers for."
18
+ )
19
+ chain: str = Field(
20
+ description="The chain to query (e.g., 'eth', 'bsc', 'polygon').",
21
+ default=DEFAULT_CHAIN,
22
+ )
23
+ contract_addresses: Optional[List[str]] = Field(
24
+ description="List of contract addresses of transfers to filter by.",
25
+ default=None,
26
+ )
27
+ from_block: Optional[int] = Field(
28
+ description="The minimum block number from which to get the transactions.",
29
+ default=None,
30
+ )
31
+ to_block: Optional[int] = Field(
32
+ description="The maximum block number from which to get the transactions.",
33
+ default=None,
34
+ )
35
+ from_date: Optional[str] = Field(
36
+ description="The start date from which to get the transactions (any format accepted by momentjs).",
37
+ default=None,
38
+ )
39
+ to_date: Optional[str] = Field(
40
+ description="Get the transactions up to this date (any format accepted by momentjs).",
41
+ default=None,
42
+ )
43
+ limit: Optional[int] = Field(
44
+ description="The desired page size of the result.",
45
+ default=DEFAULT_LIMIT,
46
+ )
47
+ order: Optional[str] = Field(
48
+ description="The order of the result, in ascending (ASC) or descending (DESC).",
49
+ default=DEFAULT_ORDER,
50
+ )
51
+ cursor: Optional[str] = Field(
52
+ description="The cursor returned in the previous response (for pagination).",
53
+ default=None,
54
+ )
55
+
56
+
57
+ class ERC20Transfers(TokenBaseTool):
58
+ """Tool for retrieving ERC20 token transfers by wallet using Moralis.
59
+
60
+ This tool uses Moralis' API to fetch ERC20 token transactions ordered by
61
+ block number in descending order for a specific wallet address.
62
+ """
63
+
64
+ name: str = "token_erc20_transfers"
65
+ description: str = (
66
+ "Get ERC20 token transactions for a wallet address, ordered by block number. "
67
+ "Returns transaction details, token information, and wallet interactions."
68
+ )
69
+ args_schema: Type[BaseModel] = ERC20TransfersInput
70
+
71
+ async def _arun(
72
+ self,
73
+ address: str,
74
+ chain: str = DEFAULT_CHAIN,
75
+ contract_addresses: Optional[List[str]] = None,
76
+ from_block: Optional[int] = None,
77
+ to_block: Optional[int] = None,
78
+ from_date: Optional[str] = None,
79
+ to_date: Optional[str] = None,
80
+ limit: Optional[int] = DEFAULT_LIMIT,
81
+ order: Optional[str] = DEFAULT_ORDER,
82
+ cursor: Optional[str] = None,
83
+ config: RunnableConfig = None,
84
+ **kwargs,
85
+ ) -> Dict[str, Any]:
86
+ """Fetch ERC20 token transfers for a wallet from Moralis.
87
+
88
+ Args:
89
+ address: The wallet address
90
+ chain: The blockchain to query
91
+ contract_addresses: List of contract addresses to filter by
92
+ from_block: Minimum block number
93
+ to_block: Maximum block number
94
+ from_date: Start date for transfers
95
+ to_date: End date for transfers
96
+ limit: Number of results per page
97
+ order: Order of results (ASC/DESC)
98
+ cursor: Pagination cursor
99
+ config: The configuration for the tool call
100
+
101
+ Returns:
102
+ Dict containing ERC20 transfer data
103
+ """
104
+ context = self.context_from_config(config)
105
+ if context is None:
106
+ logger.error("Context is None, cannot retrieve API key")
107
+ return {
108
+ "error": "Cannot retrieve API key. Please check agent configuration."
109
+ }
110
+
111
+ # Get the API key
112
+ api_key = self.get_api_key(context)
113
+
114
+ if not api_key:
115
+ logger.error("No Moralis API key available")
116
+ return {"error": "No Moralis API key provided in the configuration."}
117
+
118
+ # Build query parameters
119
+ params = {"chain": chain, "limit": limit, "order": order}
120
+
121
+ # Add optional parameters if they exist
122
+ if contract_addresses:
123
+ params["contract_addresses"] = contract_addresses
124
+ if from_block:
125
+ params["from_block"] = from_block
126
+ if to_block:
127
+ params["to_block"] = to_block
128
+ if from_date:
129
+ params["from_date"] = from_date
130
+ if to_date:
131
+ params["to_date"] = to_date
132
+ if cursor:
133
+ params["cursor"] = cursor
134
+
135
+ # Call Moralis API
136
+ try:
137
+ endpoint = f"/{address}/erc20/transfers"
138
+ return await self._make_request(
139
+ method="GET", endpoint=endpoint, api_key=api_key, params=params
140
+ )
141
+ except Exception as e:
142
+ logger.error(f"Error fetching ERC20 transfers: {e}")
143
+ return {
144
+ "error": f"An error occurred while fetching ERC20 transfers: {str(e)}. Please try again later."
145
+ }
Binary file
@@ -0,0 +1,141 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Token Skills",
4
+ "description": "Token analysis skills powered by Moralis API",
5
+ "type": "object",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/portfolio/moralis.png",
7
+ "x-tags": [
8
+ "Blockchain",
9
+ "Web3",
10
+ "Crypto",
11
+ "Token",
12
+ "DeFi"
13
+ ],
14
+ "properties": {
15
+ "enabled": {
16
+ "type": "boolean",
17
+ "title": "Enabled",
18
+ "description": "Whether this skill is enabled",
19
+ "default": true
20
+ },
21
+ "states": {
22
+ "type": "object",
23
+ "properties": {
24
+ "token_price": {
25
+ "type": "string",
26
+ "title": "ERC20 Token Price",
27
+ "enum": [
28
+ "disabled",
29
+ "public",
30
+ "private"
31
+ ],
32
+ "x-enum-title": [
33
+ "Disabled",
34
+ "Agent Owner + All Users",
35
+ "Agent Owner Only"
36
+ ],
37
+ "description": "Get the token price denominated in the blockchain's native token and USD",
38
+ "default": "public"
39
+ },
40
+ "token_erc20_transfers": {
41
+ "type": "string",
42
+ "title": "ERC20 Token Transfers",
43
+ "enum": [
44
+ "disabled",
45
+ "public",
46
+ "private"
47
+ ],
48
+ "x-enum-title": [
49
+ "Disabled",
50
+ "Agent Owner + All Users",
51
+ "Agent Owner Only"
52
+ ],
53
+ "description": "Get ERC20 token transactions ordered by block number",
54
+ "default": "public"
55
+ },
56
+ "token_search": {
57
+ "type": "string",
58
+ "title": "Token Search (Premium)",
59
+ "enum": [
60
+ "disabled",
61
+ "public",
62
+ "private"
63
+ ],
64
+ "x-enum-title": [
65
+ "Disabled",
66
+ "Agent Owner + All Users",
67
+ "Agent Owner Only"
68
+ ],
69
+ "description": "Search for tokens based on contract address, token name or token symbol. Premium endpoint available as an add-on. Requires a Moralis Business plan or Enterprise plan.",
70
+ "default": "public"
71
+ },
72
+ "token_analytics": {
73
+ "type": "string",
74
+ "title": "Token Analytics",
75
+ "enum": [
76
+ "disabled",
77
+ "public",
78
+ "private"
79
+ ],
80
+ "x-enum-title": [
81
+ "Disabled",
82
+ "Agent Owner + All Users",
83
+ "Agent Owner Only"
84
+ ],
85
+ "description": "Get analytics for a token by token address",
86
+ "default": "public"
87
+ }
88
+ },
89
+ "description": "States for each token analysis skill (disabled, public, or private)"
90
+ },
91
+ "api_key_provider": {
92
+ "type": "string",
93
+ "title": "API Key Provider",
94
+ "description": "Provider of the API key",
95
+ "enum": [
96
+ "platform",
97
+ "agent_owner"
98
+ ],
99
+ "x-enum-title": [
100
+ "Nation Hosted",
101
+ "Owner Provided"
102
+ ],
103
+ "default": "platform"
104
+ }
105
+ },
106
+ "required": [
107
+ "states",
108
+ "enabled"
109
+ ],
110
+ "if": {
111
+ "properties": {
112
+ "api_key_provider": {
113
+ "const": "agent_owner"
114
+ }
115
+ }
116
+ },
117
+ "then": {
118
+ "properties": {
119
+ "api_key": {
120
+ "type": "string",
121
+ "title": "Moralis API Key",
122
+ "description": "API key for Moralis API service",
123
+ "x-link": "[Get your API key](https://moralis.io/)",
124
+ "x-sensitive": true
125
+ }
126
+ },
127
+ "if": {
128
+ "properties": {
129
+ "enabled": {
130
+ "const": true
131
+ }
132
+ }
133
+ },
134
+ "then": {
135
+ "required": [
136
+ "api_key"
137
+ ]
138
+ }
139
+ },
140
+ "additionalProperties": true
141
+ }