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,476 @@
1
+ import json
2
+ import logging
3
+ from typing import Any, Dict, List, Optional, Type
4
+
5
+ import httpx
6
+ from langchain_core.runnables import RunnableConfig
7
+ from pydantic import BaseModel, Field
8
+
9
+ from intentkit.skills.dapplooker.base import DappLookerBaseTool
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class DappLookerTokenDataInput(BaseModel):
15
+ """Input for DappLooker token data tool."""
16
+
17
+ token_tickers: Optional[str] = Field(
18
+ description="Comma-separated list of AI agent token tickers (e.g., 'aixbt,vader'). "
19
+ "Either token_tickers or token_addresses must be provided.",
20
+ default=None,
21
+ )
22
+ token_addresses: Optional[str] = Field(
23
+ description="Comma-separated list of AI agent token contract addresses (e.g., '0x4F9Fd6Be4a90f2620860d680c0d4d5Fb53d1A825'). "
24
+ "Either token_tickers or token_addresses must be provided.",
25
+ default=None,
26
+ )
27
+ chain: str = Field(
28
+ description="Blockchain network to query (e.g., 'base', 'ethereum').",
29
+ default="base",
30
+ )
31
+
32
+
33
+ class DappLookerTokenData(DappLookerBaseTool):
34
+ """Tool for retrieving AI agent token data from DappLooker.
35
+
36
+ This tool uses DappLooker's API to fetch comprehensive crypto market data and analytics
37
+ specifically for AI agent tokens.
38
+
39
+ Attributes:
40
+ name: The name of the tool.
41
+ description: A description of what the tool does.
42
+ args_schema: The schema for the tool's input arguments.
43
+ """
44
+
45
+ name: str = "dapplooker_token_data"
46
+ description: str = (
47
+ "Retrieve detailed token market data and analytics for AI agent tokens using DappLooker. "
48
+ "Use this tool when you need current information about AI-focused crypto tokens, "
49
+ "including price, market cap, volume, technical indicators, holder insights, and developer activity.\n"
50
+ "You can query by token ticker (e.g., 'aixbt', 'vader') or by token contract address. "
51
+ "Note that this tool is specialized for AI agent tokens and may not return data for general cryptocurrencies like ETH, BTC, or SOL.\n"
52
+ "Either token_tickers or token_addresses must be provided."
53
+ )
54
+ args_schema: Type[BaseModel] = DappLookerTokenDataInput
55
+
56
+ async def _arun(
57
+ self,
58
+ token_tickers: Optional[str] = None,
59
+ token_addresses: Optional[str] = None,
60
+ chain: str = "base",
61
+ config: RunnableConfig = None,
62
+ **kwargs,
63
+ ) -> str:
64
+ """Implementation of the DappLooker token data tool.
65
+
66
+ Args:
67
+ token_tickers: Comma-separated list of token tickers.
68
+ token_addresses: Comma-separated list of token contract addresses.
69
+ chain: Blockchain network to query.
70
+ config: The configuration for the tool call.
71
+
72
+ Returns:
73
+ str: Formatted token data with market metrics and analytics.
74
+ """
75
+ context = self.context_from_config(config)
76
+ logger.debug(
77
+ f"dapplooker_token_data.py: Fetching token data with context {context}"
78
+ )
79
+
80
+ # Get the API key from the agent's configuration or environment variable
81
+ api_key = self.get_api_key(context)
82
+ if not api_key:
83
+ return "Error: No DappLooker API key provided in the configuration or environment."
84
+
85
+ # Validate input
86
+ if not token_tickers and not token_addresses:
87
+ return "Error: Either token_tickers or token_addresses must be provided."
88
+
89
+ # Check for common non-AI agent tokens that won't be in the database
90
+ # Only check if using token_tickers, not relevant for token_addresses
91
+ if (
92
+ token_tickers
93
+ and not token_addresses
94
+ and token_tickers.lower()
95
+ in [
96
+ "btc",
97
+ "eth",
98
+ "sol",
99
+ "bitcoin",
100
+ "ethereum",
101
+ "solana",
102
+ "bnb",
103
+ "xrp",
104
+ "ada",
105
+ "doge",
106
+ ]
107
+ ):
108
+ return (
109
+ f"The token '{token_tickers}' is not an AI agent token and is not tracked by DappLooker. "
110
+ f"DappLooker specializes in AI agent tokens like 'aixbt', 'vader', and other AI-focused crypto projects. "
111
+ f"Please try querying for an AI agent token instead."
112
+ )
113
+
114
+ # Set up the request parameters
115
+ params = {
116
+ "api_key": api_key,
117
+ "chain": chain,
118
+ }
119
+
120
+ # Add either token_tickers or token_addresses to the parameters
121
+ if token_tickers:
122
+ params["token_tickers"] = token_tickers
123
+ if token_addresses:
124
+ params["token_addresses"] = token_addresses
125
+
126
+ logger.debug(f"dapplooker_token_data.py: Request params: {params}")
127
+
128
+ # Call DappLooker API
129
+ try:
130
+ async with httpx.AsyncClient(timeout=30.0) as client:
131
+ response = await client.get(
132
+ "https://api.dapplooker.com/v1/crypto-market/",
133
+ params=params,
134
+ )
135
+
136
+ logger.debug(
137
+ f"dapplooker_token_data.py: API response status: {response.status_code}"
138
+ )
139
+
140
+ if response.status_code != 200:
141
+ logger.error(
142
+ f"dapplooker_token_data.py: Error from DappLooker API: {response.status_code} - {response.text}"
143
+ )
144
+ return f"Error retrieving token data: {response.status_code} - {response.text}"
145
+
146
+ # Parse the API response
147
+ response_json = response.json()
148
+ logger.debug(
149
+ f"dapplooker_token_data.py: Response type: {type(response_json)}"
150
+ )
151
+
152
+ # Check if response is a string and try to parse it
153
+ if isinstance(response_json, str):
154
+ try:
155
+ response_json = json.loads(response_json)
156
+ logger.debug(
157
+ "dapplooker_token_data.py: Parsed string response as JSON"
158
+ )
159
+ except json.JSONDecodeError as e:
160
+ logger.error(
161
+ f"dapplooker_token_data.py: Error parsing JSON: {e}"
162
+ )
163
+ return f"Error processing token data: {e}"
164
+
165
+ # Extract the data array from the response
166
+ # The API returns {"success": true, "data": [...]}
167
+ if isinstance(response_json, dict) and "data" in response_json:
168
+ data = response_json["data"]
169
+ logger.debug(
170
+ f"dapplooker_token_data.py: Found data array with {len(data)} items"
171
+ )
172
+ else:
173
+ data = response_json # Fallback for backward compatibility
174
+ logger.debug(
175
+ "dapplooker_token_data.py: Using response as data (fallback)"
176
+ )
177
+
178
+ logger.debug(
179
+ f"dapplooker_token_data.py: Received data type: {type(data)}"
180
+ )
181
+
182
+ if not data or data == []:
183
+ query_type = (
184
+ "tickers"
185
+ if token_tickers and not token_addresses
186
+ else "addresses"
187
+ )
188
+ query_value = token_tickers if token_tickers else token_addresses
189
+ return (
190
+ f"No results found for {query_type}: '{query_value}' on chain '{chain}'. "
191
+ f"This may be because:\n"
192
+ f"1. The token is not an AI agent token tracked by DappLooker\n"
193
+ f"2. The token ticker or address is incorrect\n"
194
+ f"3. The token exists on a different blockchain than '{chain}'\n\n"
195
+ f"DappLooker specializes in AI agent tokens like 'aixbt', 'vader', and other AI-focused crypto projects."
196
+ )
197
+
198
+ # Format the results
199
+ return self._format_token_data(data)
200
+
201
+ except Exception as e:
202
+ logger.error(
203
+ f"dapplooker_token_data.py: Error retrieving token data: {e}",
204
+ exc_info=True,
205
+ )
206
+ return (
207
+ "An error occurred while retrieving token data. Please try again later."
208
+ )
209
+
210
+ def _format_token_data(self, data: List[Dict[str, Any]]) -> str:
211
+ """Format the token data for display.
212
+
213
+ Args:
214
+ data: List of token data dictionaries from DappLooker API.
215
+
216
+ Returns:
217
+ str: Formatted token data.
218
+ """
219
+ if not data:
220
+ return "No token data available."
221
+
222
+ # Ensure data is a list
223
+ if not isinstance(data, list):
224
+ # If data is a dict, wrap it in a list
225
+ if isinstance(data, dict):
226
+ data = [data]
227
+ else:
228
+ return f"Error: Unexpected data format received from API: {type(data)}"
229
+
230
+ formatted_results = "# AI Agent Token Market Data\n\n"
231
+
232
+ for token in data:
233
+ # Ensure token is a dict
234
+ if not isinstance(token, dict):
235
+ logger.error(
236
+ f"dapplooker_token_data.py: Token is not a dictionary: {token}"
237
+ )
238
+ continue
239
+
240
+ token_info = token.get("token_info", {})
241
+ token_metrics = token.get("token_metrics", {})
242
+ technical_indicators = token.get("technical_indicators", {})
243
+ token_holder_insights = token.get("token_holder_insights", {})
244
+ smart_money_insights = token.get("smart_money_insights", {})
245
+ dev_wallet_insights = token.get("dev_wallet_insights", {})
246
+
247
+ # Token basic info
248
+ name = token_info.get("name", "Unknown")
249
+ symbol = token_info.get("symbol", "Unknown")
250
+ chain = token_info.get("chain", "Unknown")
251
+ address = token_info.get("ca", "Unknown")
252
+ ecosystem = token_info.get("ecosystem", "Unknown")
253
+ description = token_info.get("description", "")
254
+ handle = token_info.get("handle", "Unknown")
255
+
256
+ formatted_results += f"## {name} ({symbol})\n"
257
+ formatted_results += f"Chain: {chain}\n"
258
+ formatted_results += f"Ecosystem: {ecosystem}\n"
259
+ formatted_results += f"Contract: {address}\n"
260
+ if handle:
261
+ formatted_results += f"Handle: {handle}\n"
262
+ if description:
263
+ formatted_results += f"Description: {description}\n"
264
+ formatted_results += "\n"
265
+
266
+ # Price and market metrics
267
+ if token_metrics:
268
+ formatted_results += "### Market Metrics\n"
269
+ price = token_metrics.get("usd_price", "Unknown")
270
+ mcap = token_metrics.get("mcap", "Unknown")
271
+ fdv = token_metrics.get("fdv", "Unknown")
272
+ volume_24h = token_metrics.get("volume_24h", "Unknown")
273
+ total_liquidity = token_metrics.get("total_liquidity", "Unknown")
274
+
275
+ formatted_results += f"Price: ${price}\n"
276
+ formatted_results += f"Market Cap: ${mcap}\n"
277
+ formatted_results += f"Fully Diluted Value: ${fdv}\n"
278
+ formatted_results += f"24h Volume: ${volume_24h}\n"
279
+ formatted_results += f"Total Liquidity: ${total_liquidity}\n"
280
+
281
+ # Price changes
282
+ price_change_1h = token_metrics.get(
283
+ "price_change_percentage_1h", "Unknown"
284
+ )
285
+ price_change_24h = token_metrics.get(
286
+ "price_change_percentage_24h", "Unknown"
287
+ )
288
+ price_change_7d = token_metrics.get(
289
+ "price_change_percentage_7d", "Unknown"
290
+ )
291
+ price_change_30d = token_metrics.get(
292
+ "price_change_percentage_30d", "Unknown"
293
+ )
294
+
295
+ formatted_results += f"Price Change 1h: {price_change_1h}%\n"
296
+ formatted_results += f"Price Change 24h: {price_change_24h}%\n"
297
+ formatted_results += f"Price Change 7d: {price_change_7d}%\n"
298
+ formatted_results += f"Price Change 30d: {price_change_30d}%\n"
299
+
300
+ # Volume and Market Cap changes
301
+ volume_change_7d = token_metrics.get(
302
+ "volume_change_percentage_7d", "Unknown"
303
+ )
304
+ volume_change_30d = token_metrics.get(
305
+ "volume_change_percentage_30d", "Unknown"
306
+ )
307
+ mcap_change_7d = token_metrics.get(
308
+ "mcap_change_percentage_7d", "Unknown"
309
+ )
310
+ mcap_change_30d = token_metrics.get(
311
+ "mcap_change_percentage_30d", "Unknown"
312
+ )
313
+
314
+ formatted_results += f"Volume Change 7d: {volume_change_7d}%\n"
315
+ formatted_results += f"Volume Change 30d: {volume_change_30d}%\n"
316
+ formatted_results += f"Market Cap Change 7d: {mcap_change_7d}%\n"
317
+ formatted_results += f"Market Cap Change 30d: {mcap_change_30d}%\n"
318
+
319
+ # Price highs
320
+ price_high_24h = token_metrics.get("price_high_24h", "Unknown")
321
+ price_ath = token_metrics.get("price_ath", "Unknown")
322
+
323
+ formatted_results += f"24h High: ${price_high_24h}\n"
324
+ formatted_results += f"All-Time High: ${price_ath}\n\n"
325
+
326
+ # Technical indicators
327
+ if technical_indicators:
328
+ formatted_results += "### Technical Indicators\n"
329
+ support = technical_indicators.get("support", "Unknown")
330
+ resistance = technical_indicators.get("resistance", "Unknown")
331
+ rsi = technical_indicators.get("rsi", "Unknown")
332
+ sma = technical_indicators.get("sma", "Unknown")
333
+
334
+ formatted_results += f"Support: ${support}\n"
335
+ formatted_results += f"Resistance: ${resistance}\n"
336
+ formatted_results += f"RSI: {rsi}\n"
337
+ formatted_results += f"SMA: ${sma}\n\n"
338
+
339
+ # Token Holder Insights
340
+ if token_holder_insights:
341
+ formatted_results += "### Token Holder Insights\n"
342
+ total_holders = token_holder_insights.get(
343
+ "total_holder_count", "Unknown"
344
+ )
345
+ holder_change_24h = token_holder_insights.get(
346
+ "holder_count_change_percentage_24h", "Unknown"
347
+ )
348
+ fifty_percent_wallets = token_holder_insights.get(
349
+ "fifty_percentage_holding_wallet_count", "Unknown"
350
+ )
351
+
352
+ # First 100 buyers metrics
353
+ first_100_initial = token_holder_insights.get(
354
+ "first_100_buyers_initial_bought", "Unknown"
355
+ )
356
+ first_100_initial_pct = token_holder_insights.get(
357
+ "first_100_buyers_initial_bought_percentage", "Unknown"
358
+ )
359
+ first_100_current = token_holder_insights.get(
360
+ "first_100_buyers_current_holding", "Unknown"
361
+ )
362
+ first_100_current_pct = token_holder_insights.get(
363
+ "first_100_buyers_current_holding_percentage", "Unknown"
364
+ )
365
+
366
+ # Top holders concentration
367
+ top_10_balance = token_holder_insights.get(
368
+ "top_10_holder_balance", "Unknown"
369
+ )
370
+ top_10_pct = token_holder_insights.get(
371
+ "top_10_holder_percentage", "Unknown"
372
+ )
373
+ top_50_balance = token_holder_insights.get(
374
+ "top_50_holder_balance", "Unknown"
375
+ )
376
+ top_50_pct = token_holder_insights.get(
377
+ "top_50_holder_percentage", "Unknown"
378
+ )
379
+ top_100_balance = token_holder_insights.get(
380
+ "top_100_holder_balance", "Unknown"
381
+ )
382
+ top_100_pct = token_holder_insights.get(
383
+ "top_100_holder_percentage", "Unknown"
384
+ )
385
+
386
+ if total_holders != "Unknown":
387
+ formatted_results += f"Total Holders: {total_holders}\n"
388
+ formatted_results += f"Holder Change 24h: {holder_change_24h}%\n"
389
+ if fifty_percent_wallets != "Unknown":
390
+ formatted_results += (
391
+ f"Wallets Holding 50%: {fifty_percent_wallets}\n"
392
+ )
393
+
394
+ formatted_results += f"First 100 Buyers Initial: {first_100_initial} ({first_100_initial_pct}%)\n"
395
+ formatted_results += f"First 100 Buyers Current: {first_100_current} ({first_100_current_pct}%)\n"
396
+
397
+ formatted_results += (
398
+ f"Top 10 Holders: {top_10_balance} ({top_10_pct}%)\n"
399
+ )
400
+ formatted_results += (
401
+ f"Top 50 Holders: {top_50_balance} ({top_50_pct}%)\n"
402
+ )
403
+ formatted_results += (
404
+ f"Top 100 Holders: {top_100_balance} ({top_100_pct}%)\n\n"
405
+ )
406
+
407
+ # Smart money insights
408
+ if smart_money_insights:
409
+ formatted_results += "### Smart Money Insights\n"
410
+ top_buys = smart_money_insights.get("top_25_holder_buy_24h", "Unknown")
411
+ top_sells = smart_money_insights.get(
412
+ "top_25_holder_sold_24h", "Unknown"
413
+ )
414
+
415
+ formatted_results += f"Top 25 Holders Buy 24h: {top_buys}\n"
416
+ formatted_results += f"Top 25 Holders Sell 24h: {top_sells}\n\n"
417
+
418
+ # Developer Wallet Insights
419
+ if dev_wallet_insights:
420
+ formatted_results += "### Developer Wallet Insights\n"
421
+ wallet_address = dev_wallet_insights.get("wallet_address", "Unknown")
422
+ wallet_balance = dev_wallet_insights.get("wallet_balance", "Unknown")
423
+ wallet_percentage = dev_wallet_insights.get(
424
+ "dev_wallet_total_holding_percentage", "Unknown"
425
+ )
426
+ outflow_txs = dev_wallet_insights.get(
427
+ "dev_wallet_outflow_txs_count_24h", "Unknown"
428
+ )
429
+ outflow_amount = dev_wallet_insights.get(
430
+ "dev_wallet_outflow_amount_24h", "Unknown"
431
+ )
432
+ fresh_wallet = dev_wallet_insights.get("fresh_wallet", False)
433
+ dev_sold = dev_wallet_insights.get("dev_sold", False)
434
+ dev_sold_percentage = dev_wallet_insights.get(
435
+ "dev_sold_percentage", "Unknown"
436
+ )
437
+ bundle_wallet_count = dev_wallet_insights.get(
438
+ "bundle_wallet_count", "Unknown"
439
+ )
440
+ bundle_wallet_supply = dev_wallet_insights.get(
441
+ "bundle_wallet_supply_percentage", "Unknown"
442
+ )
443
+
444
+ formatted_results += f"Developer Wallet: {wallet_address}\n"
445
+ if wallet_balance != "Unknown":
446
+ formatted_results += f"Wallet Balance: {wallet_balance}\n"
447
+ if wallet_percentage != "Unknown":
448
+ formatted_results += f"Wallet Holding %: {wallet_percentage}%\n"
449
+ if outflow_txs != "Unknown":
450
+ formatted_results += f"Outflow Txs 24h: {outflow_txs}\n"
451
+ if outflow_amount != "Unknown":
452
+ formatted_results += f"Outflow Amount 24h: {outflow_amount}\n"
453
+ formatted_results += f"Fresh Wallet: {fresh_wallet}\n"
454
+ formatted_results += f"Dev Has Sold: {dev_sold}\n"
455
+ formatted_results += f"Dev Sold %: {dev_sold_percentage}%\n"
456
+ formatted_results += f"Bundle Wallet Count: {bundle_wallet_count}\n"
457
+ formatted_results += f"Bundle Supply %: {bundle_wallet_supply}%\n\n"
458
+
459
+ # Supply information
460
+ if token_metrics:
461
+ formatted_results += "### Supply Information\n"
462
+ circ_supply = token_metrics.get("circulating_supply", "Unknown")
463
+ total_supply = token_metrics.get("total_supply", "Unknown")
464
+
465
+ formatted_results += f"Circulating Supply: {circ_supply}\n"
466
+ formatted_results += f"Total Supply: {total_supply}\n\n"
467
+
468
+ # Last Updated
469
+ last_updated = token.get("last_updated_at", "Unknown")
470
+ if last_updated != "Unknown":
471
+ formatted_results += f"Last Updated: {last_updated}\n\n"
472
+
473
+ # Add separator between tokens
474
+ formatted_results += "---\n\n"
475
+
476
+ return formatted_results.strip()
@@ -0,0 +1,91 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "DappLooker",
5
+ "description": "Retrieve comprehensive market data and analytics for AI agent tokens using DappLooker. This API specializes in AI-focused crypto projects and may not provide data for general cryptocurrencies like BTC or ETH.",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/dapplooker/dapplooker.jpg",
7
+ "x-tags": [
8
+ "Crypto",
9
+ "Market Data",
10
+ "Token Metrics",
11
+ "AI Agents"
12
+ ],
13
+ "properties": {
14
+ "enabled": {
15
+ "type": "boolean",
16
+ "title": "Enabled",
17
+ "description": "Whether this skill is enabled",
18
+ "default": true
19
+ },
20
+ "states": {
21
+ "type": "object",
22
+ "properties": {
23
+ "dapplooker_token_data": {
24
+ "type": "string",
25
+ "title": "AI Token Data",
26
+ "enum": [
27
+ "disabled",
28
+ "public",
29
+ "private"
30
+ ],
31
+ "x-enum-title": [
32
+ "Disabled",
33
+ "Agent Owner + All Users",
34
+ "Agent Owner Only"
35
+ ],
36
+ "description": "Retrieve detailed market data and analytics for AI-focused tokens by ticker or address",
37
+ "default": "private"
38
+ }
39
+ },
40
+ "description": "States for each DappLooker skill (disabled, public, or private)"
41
+ },
42
+ "api_key_provider": {
43
+ "type": "string",
44
+ "title": "API Key Provider",
45
+ "description": "Provider of the API key",
46
+ "enum": [
47
+ "platform",
48
+ "agent_owner"
49
+ ],
50
+ "x-enum-title": [
51
+ "Nation Hosted",
52
+ "Owner Provided"
53
+ ],
54
+ "default": "platform"
55
+ }
56
+ },
57
+ "required": [
58
+ "states",
59
+ "enabled"
60
+ ],
61
+ "if": {
62
+ "properties": {
63
+ "api_key_provider": {
64
+ "const": "agent_owner"
65
+ }
66
+ }
67
+ },
68
+ "then": {
69
+ "properties": {
70
+ "api_key": {
71
+ "type": "string",
72
+ "title": "DappLooker API Key",
73
+ "description": "API key for DappLooker service",
74
+ "x-sensitive": true
75
+ }
76
+ },
77
+ "if": {
78
+ "properties": {
79
+ "enabled": {
80
+ "const": true
81
+ }
82
+ }
83
+ },
84
+ "then": {
85
+ "required": [
86
+ "api_key"
87
+ ]
88
+ }
89
+ },
90
+ "additionalProperties": true
91
+ }