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,243 @@
1
+ import logging
2
+ from datetime import datetime, timezone
3
+ from decimal import Decimal
4
+ from typing import Annotated, Optional
5
+
6
+ from intentkit.models.base import Base
7
+ from intentkit.models.credit import CreditAccount
8
+ from intentkit.models.db import get_session
9
+ from pydantic import BaseModel, ConfigDict, Field
10
+ from sqlalchemy import Column, DateTime, Index, Integer, String, func, select
11
+ from sqlalchemy.dialects.postgresql import JSON, JSONB
12
+ from sqlalchemy.ext.asyncio import AsyncSession
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class UserTable(Base):
18
+ """User database table model."""
19
+
20
+ __tablename__ = "users"
21
+ __table_args__ = (
22
+ Index("ix_users_x_username", "x_username"),
23
+ Index("ix_users_telegram_username", "telegram_username"),
24
+ )
25
+
26
+ id = Column(
27
+ String,
28
+ primary_key=True,
29
+ )
30
+ nft_count = Column(
31
+ Integer,
32
+ default=0,
33
+ nullable=False,
34
+ )
35
+ email = Column(
36
+ String,
37
+ nullable=True,
38
+ )
39
+ x_username = Column(
40
+ String,
41
+ nullable=True,
42
+ )
43
+ github_username = Column(
44
+ String,
45
+ nullable=True,
46
+ )
47
+ telegram_username = Column(
48
+ String,
49
+ nullable=True,
50
+ )
51
+ extra = Column(
52
+ JSON().with_variant(JSONB(), "postgresql"),
53
+ nullable=True,
54
+ )
55
+ created_at = Column(
56
+ DateTime(timezone=True),
57
+ nullable=False,
58
+ server_default=func.now(),
59
+ )
60
+ updated_at = Column(
61
+ DateTime(timezone=True),
62
+ nullable=False,
63
+ server_default=func.now(),
64
+ onupdate=lambda: datetime.now(timezone.utc),
65
+ )
66
+
67
+
68
+ class UserUpdate(BaseModel):
69
+ """User update model without id and timestamps."""
70
+
71
+ model_config = ConfigDict(
72
+ from_attributes=True,
73
+ json_encoders={
74
+ datetime: lambda v: v.isoformat(timespec="milliseconds"),
75
+ },
76
+ )
77
+
78
+ nft_count: Annotated[
79
+ int, Field(default=0, description="Number of NFTs owned by the user")
80
+ ]
81
+ email: Annotated[Optional[str], Field(None, description="User's email address")]
82
+ x_username: Annotated[
83
+ Optional[str], Field(None, description="User's X (Twitter) username")
84
+ ]
85
+ github_username: Annotated[
86
+ Optional[str], Field(None, description="User's GitHub username")
87
+ ]
88
+ telegram_username: Annotated[
89
+ Optional[str], Field(None, description="User's Telegram username")
90
+ ]
91
+ extra: Annotated[
92
+ Optional[dict], Field(None, description="Additional user information")
93
+ ]
94
+
95
+ async def _update_quota_for_nft_count(
96
+ self, db: AsyncSession, id: str, new_nft_count: int
97
+ ) -> None:
98
+ """Update user's daily quota based on NFT count.
99
+
100
+ Args:
101
+ db: Database session
102
+ id: User ID
103
+ new_nft_count: Current NFT count
104
+ """
105
+ # Generate upstream_tx_id
106
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S")
107
+ upstream_tx_id = f"nft_{id}_{timestamp}"
108
+
109
+ # Calculate new quota values based on nft_count
110
+ free_quota = Decimal(480 + 48 * new_nft_count)
111
+ refill_amount = Decimal(20 + 2 * new_nft_count)
112
+ note = f"NFT count changed to {new_nft_count}"
113
+
114
+ # Update daily quota
115
+ logger.info(
116
+ f"Updating daily quota for user {id} due to NFT count change to {new_nft_count}"
117
+ )
118
+ await CreditAccount.update_daily_quota(
119
+ db,
120
+ id,
121
+ free_quota=free_quota,
122
+ refill_amount=refill_amount,
123
+ upstream_tx_id=upstream_tx_id,
124
+ note=note,
125
+ )
126
+
127
+ async def patch(self, id: str) -> "User":
128
+ """Update only the provided fields of a user in the database.
129
+ If the user doesn't exist, create a new one with the provided ID and fields.
130
+ If nft_count changes, update the daily quota accordingly.
131
+
132
+ Args:
133
+ id: ID of the user to update or create
134
+
135
+ Returns:
136
+ Updated or newly created User model
137
+ """
138
+ async with get_session() as db:
139
+ db_user = await db.get(UserTable, id)
140
+ old_nft_count = 0 # Default for new users
141
+
142
+ if not db_user:
143
+ # Create new user if it doesn't exist
144
+ db_user = UserTable(id=id)
145
+ db.add(db_user)
146
+ else:
147
+ old_nft_count = db_user.nft_count
148
+
149
+ # Update only the fields that were provided
150
+ update_data = self.model_dump(exclude_unset=True)
151
+ for key, value in update_data.items():
152
+ setattr(db_user, key, value)
153
+
154
+ # Check if nft_count has changed and is in the update data
155
+ if "nft_count" in update_data and old_nft_count != update_data["nft_count"]:
156
+ await self._update_quota_for_nft_count(db, id, update_data["nft_count"])
157
+
158
+ await db.commit()
159
+ await db.refresh(db_user)
160
+
161
+ return User.model_validate(db_user)
162
+
163
+ async def put(self, id: str) -> "User":
164
+ """Replace all fields of a user in the database with the provided values.
165
+ If the user doesn't exist, create a new one with the provided ID and fields.
166
+ If nft_count changes, update the daily quota accordingly.
167
+
168
+ Args:
169
+ id: ID of the user to update or create
170
+
171
+ Returns:
172
+ Updated or newly created User model
173
+ """
174
+ async with get_session() as db:
175
+ db_user = await db.get(UserTable, id)
176
+ old_nft_count = 0 # Default for new users
177
+
178
+ if not db_user:
179
+ # Create new user if it doesn't exist
180
+ db_user = UserTable(id=id)
181
+ db.add(db_user)
182
+ else:
183
+ old_nft_count = db_user.nft_count
184
+
185
+ # Replace all fields with the provided values
186
+ for key, value in self.model_dump().items():
187
+ setattr(db_user, key, value)
188
+
189
+ # Check if nft_count has changed
190
+ if old_nft_count != self.nft_count:
191
+ await self._update_quota_for_nft_count(db, id, self.nft_count)
192
+
193
+ await db.commit()
194
+ await db.refresh(db_user)
195
+
196
+ return User.model_validate(db_user)
197
+
198
+
199
+ class User(UserUpdate):
200
+ """User model with all fields including id and timestamps."""
201
+
202
+ id: Annotated[
203
+ str,
204
+ Field(description="Unique identifier for the user"),
205
+ ]
206
+ created_at: Annotated[
207
+ datetime, Field(description="Timestamp when this user was created")
208
+ ]
209
+ updated_at: Annotated[
210
+ datetime, Field(description="Timestamp when this user was last updated")
211
+ ]
212
+
213
+ @classmethod
214
+ async def get(cls, user_id: str) -> Optional["User"]:
215
+ """Get a user by ID.
216
+
217
+ Args:
218
+ user_id: ID of the user to get
219
+
220
+ Returns:
221
+ User model or None if not found
222
+ """
223
+ async with get_session() as session:
224
+ return await cls.get_in_session(session, user_id)
225
+
226
+ @classmethod
227
+ async def get_in_session(
228
+ cls, session: AsyncSession, user_id: str
229
+ ) -> Optional["User"]:
230
+ """Get a user by ID using the provided session.
231
+
232
+ Args:
233
+ session: Database session
234
+ user_id: ID of the user to get
235
+
236
+ Returns:
237
+ User model or None if not found
238
+ """
239
+ result = await session.execute(select(UserTable).where(UserTable.id == user_id))
240
+ user = result.scalars().first()
241
+ if user is None:
242
+ return None
243
+ return cls.model_validate(user)
@@ -0,0 +1,12 @@
1
+ import os
2
+ import pkgutil
3
+
4
+ # Get the directory containing this __init__.py file
5
+ package_dir = os.path.dirname(__file__)
6
+
7
+ # Discover all modules in the skills directory
8
+ __all__ = [
9
+ name
10
+ for _, name, _ in pkgutil.iter_modules([package_dir])
11
+ if not name.startswith("_") and not name == "base"
12
+ ]
@@ -0,0 +1,83 @@
1
+ """Acolyt skill module."""
2
+
3
+ import logging
4
+ from typing import NotRequired, TypedDict
5
+
6
+ from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.skills.acolyt.ask import AcolytAskGpt
8
+ from intentkit.skills.acolyt.base import AcolytBaseTool
9
+ from intentkit.skills.base import SkillConfig, SkillState
10
+
11
+ # Cache skills at the system level, because they are stateless
12
+ _cache: dict[str, AcolytBaseTool] = {}
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class SkillStates(TypedDict):
18
+ ask_gpt: SkillState
19
+
20
+
21
+ class Config(SkillConfig):
22
+ """Configuration for Acolyt skills."""
23
+
24
+ states: SkillStates
25
+ api_key: NotRequired[str]
26
+
27
+
28
+ async def get_skills(
29
+ config: "Config",
30
+ is_private: bool,
31
+ store: SkillStoreABC,
32
+ **_,
33
+ ) -> list[AcolytBaseTool]:
34
+ """Get all Acolyt skills.
35
+
36
+ Args:
37
+ config: The configuration for Acolyt skills.
38
+ is_private: Whether to include private skills.
39
+ store: The skill store for persisting data.
40
+
41
+ Returns:
42
+ A list of Acolyt skills.
43
+ """
44
+ available_skills = []
45
+
46
+ # Include skills based on their state
47
+ for skill_name, state in config["states"].items():
48
+ if state == "disabled":
49
+ continue
50
+ elif state == "public" or (state == "private" and is_private):
51
+ available_skills.append(skill_name)
52
+
53
+ # Get each skill using the cached getter
54
+ result = []
55
+ for name in available_skills:
56
+ skill = get_acolyt_skill(name, store)
57
+ if skill:
58
+ result.append(skill)
59
+ return result
60
+
61
+
62
+ def get_acolyt_skill(
63
+ name: str,
64
+ store: SkillStoreABC,
65
+ ) -> AcolytBaseTool | None:
66
+ """Get an Acolyt skill by name.
67
+
68
+ Args:
69
+ name: The name of the skill to get
70
+ store: The skill store for persisting data
71
+
72
+ Returns:
73
+ The requested Acolyt skill
74
+ """
75
+ if name == "ask_gpt":
76
+ if name not in _cache:
77
+ _cache[name] = AcolytAskGpt(
78
+ skill_store=store,
79
+ )
80
+ return _cache[name]
81
+ else:
82
+ logger.warning(f"Unknown Acolyt skill: {name}")
83
+ return None
Binary file
@@ -0,0 +1,128 @@
1
+ import logging
2
+ from typing import Dict, Type
3
+
4
+ import httpx
5
+ from langchain_core.runnables import RunnableConfig
6
+ from pydantic import BaseModel, Field
7
+ from typing_extensions import Literal
8
+
9
+ from intentkit.skills.acolyt.base import AcolytBaseTool
10
+
11
+ from .base import base_url
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class AcolytAskGptInput(BaseModel):
17
+ question: str
18
+
19
+
20
+ class InputMessage(BaseModel):
21
+ role: Literal["system", "user", "assistant", "tool", "function"] = Field(
22
+ "user", description="The role of the message sender."
23
+ )
24
+ content: str
25
+
26
+
27
+ class AcolytAskGptRequest(BaseModel):
28
+ messages: list[InputMessage]
29
+ model: str | None = Field("gpt-4o", description="The AI model to be used.")
30
+ stream: bool | None = Field(
31
+ False, description="To request for response of type stream."
32
+ )
33
+ temperature: float | None = Field(
34
+ 0.7,
35
+ le=2,
36
+ ge=0,
37
+ description="Controls the degree of randomness in the generated text.",
38
+ )
39
+
40
+
41
+ class AcolytAskGpt(AcolytBaseTool):
42
+ """
43
+ The Acolyt Data Fetcher is a versatile LangChain tool designed to interact with the Acolyt chat API to retrieve insightful data
44
+ across various categories, including Twitter Metrics, Onchain Analysis, DEX & Trading, and Overall Metrics. This tool seamlessly
45
+ processes user queries, fetches relevant data from the Acolyt API, and returns concise, summarized responses for easy consumption.
46
+
47
+ Features:
48
+ - Twitter Metrics: Retrieve engagement metrics for specific Twitter accounts, Identify which AI agents have the highest count of smart followers, Display the best tweets from specified accounts, Compare the mindshare between different AI agents, Determine which agents have the highest impressions-to-followers ratio.
49
+ - Onchain Analysis: Fetch the current market capitalization for tokens, Show the distribution of top holders for tokens, Identify tokens with the highest whale concentration, Compare holder retention rates between tokens, Calculate the Herfindahl index for tokens, List tokens with large amount of holders.
50
+ - DEX & Trading: Get the 24-hour trading volume for tokens, Identify which DEX has the highest liquidity for tokens, Obtain the buy/sell ratio for tokens over specific time periods. Compare price changes across different timeframes for tokens. List trading pairs with over a value in liquidity for tokens.
51
+ - Overall Metrics: Identify projects with the highest smart engagement relative to their market cap, Determine which agents have the best mindshare relative to their market cap. Compare the percentage of smart followers across the top n AI agents by market cap
52
+
53
+
54
+ Attributes:
55
+ name (str): Name of the tool, specifically "acolyt_ask_gpt".
56
+ description (str): Comprehensive description of the tool's purpose and functionality.
57
+ args_schema (Type[BaseModel]): Schema for input arguments, specifying expected parameters.
58
+ """
59
+
60
+ name: str = "acolyt_ask_gpt"
61
+ description: str = """
62
+ The Acolyt Data Fetcher is a LangChain tool accessing the Acolyt chat API for data across Twitter Metrics, Onchain Analysis, DEX & Trading, and Overall Metrics. It processes queries, fetches data, and returns summarized responses. Features include:
63
+
64
+ Twitter: Engagement metrics, top smart follower counts, best tweets, mindshare comparison, impressions/follower ratio.
65
+ Onchain: Market cap, holder distribution, whale concentration, holder retention, Herfindahl index, high holder count tokens.
66
+ DEX & Trading: 24h volume, top DEX liquidity, buy/sell ratio, price change comparison, high liquidity pairs.
67
+ Overall: Smart engagement/market cap ratio, mindshare/market cap ratio, smart follower percentage comparison across top AI agents.
68
+ """
69
+ args_schema: Type[BaseModel] = AcolytAskGptInput
70
+
71
+ async def _arun(self, question: str, config: RunnableConfig, **kwargs) -> Dict:
72
+ """Run the tool to get answer from Acolyt GPT.
73
+
74
+ Args:
75
+ question (str): The question body from user.
76
+ config (RunnableConfig): The configuration for the runnable, containing agent context.
77
+
78
+ Returns:
79
+ Dict: The response from the API with message content.
80
+
81
+ Raises:
82
+ Exception: If there's an error accessing the Acolyt API.
83
+ """
84
+ context = self.context_from_config(config)
85
+ api_key = self.get_api_key(context)
86
+ if not api_key:
87
+ raise ValueError("Acolyt API key not found")
88
+
89
+ url = f"{base_url}/api/chat/completions"
90
+ headers = {
91
+ "accept": "application/json",
92
+ "Authorization": f"Bearer {api_key}",
93
+ }
94
+
95
+ body = AcolytAskGptRequest(
96
+ messages=[InputMessage(content=question)],
97
+ ).model_dump(exclude_none=True)
98
+
99
+ async with httpx.AsyncClient() as client:
100
+ try:
101
+ response = await client.post(
102
+ url, headers=headers, timeout=30, json=body
103
+ )
104
+ response.raise_for_status()
105
+ json_dict = response.json()
106
+
107
+ # Extract message content directly
108
+ if "choices" in json_dict and len(json_dict["choices"]) > 0:
109
+ if (
110
+ "message" in json_dict["choices"][0]
111
+ and "content" in json_dict["choices"][0]["message"]
112
+ ):
113
+ return json_dict
114
+ else:
115
+ raise ValueError("Unexpected response format from Acolyt API")
116
+ else:
117
+ raise ValueError("Empty response from Acolyt API")
118
+
119
+ except httpx.RequestError as req_err:
120
+ raise ValueError(
121
+ f"Request error from Acolyt API: {req_err}"
122
+ ) from req_err
123
+ except httpx.HTTPStatusError as http_err:
124
+ raise ValueError(
125
+ f"HTTP error from Acolyt API: {http_err}"
126
+ ) from http_err
127
+ except Exception as e:
128
+ raise ValueError(f"Error from Acolyt API: {e}") from e
@@ -0,0 +1,28 @@
1
+ from typing import Optional, Type
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from intentkit.abstracts.skill import SkillStoreABC
6
+ from intentkit.skills.base import IntentKitSkill, SkillContext
7
+
8
+ base_url = "https://acolyt-oracle-poc.vercel.app"
9
+
10
+
11
+ class AcolytBaseTool(IntentKitSkill):
12
+ """Base class for Acolyt tools."""
13
+
14
+ name: str = Field(description="The name of the tool")
15
+ description: str = Field(description="A description of what the tool does")
16
+ args_schema: Type[BaseModel]
17
+ skill_store: SkillStoreABC = Field(
18
+ description="The skill store for persisting data"
19
+ )
20
+
21
+ def get_api_key(self, context: SkillContext) -> Optional[str]:
22
+ if "api_key" in context.config and context.config["api_key"]:
23
+ return context.config["api_key"]
24
+ return self.skill_store.get_system_config("acolyt_api_key")
25
+
26
+ @property
27
+ def category(self) -> str:
28
+ return "acolyt"
@@ -0,0 +1,89 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "title": "Acolyt",
5
+ "description": "Integration with Acolyt Oracle providing blockchain oracle services for accessing and verifying off-chain data with secure API connections",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/acolyt/acolyt.jpg",
7
+ "x-tags": [
8
+ "Blockchain",
9
+ "Oracle"
10
+ ],
11
+ "properties": {
12
+ "enabled": {
13
+ "type": "boolean",
14
+ "title": "Enabled",
15
+ "description": "Whether this skill is enabled",
16
+ "default": false
17
+ },
18
+ "states": {
19
+ "type": "object",
20
+ "properties": {
21
+ "ask_gpt": {
22
+ "type": "string",
23
+ "title": "Ask GPT",
24
+ "enum": [
25
+ "disabled",
26
+ "public",
27
+ "private"
28
+ ],
29
+ "x-enum-title": [
30
+ "Disabled",
31
+ "Agent Owner + All Users",
32
+ "Agent Owner Only"
33
+ ],
34
+ "description": "The Acolyt Data Fetcher is a LangChain tool accessing the Acolyt chat API for data across X Metrics, Onchain Analysis, DEX & Trading, and Overall Metrics. It processes queries, fetches data, and returns summarized responses. Features include:\n Twitter: Engagement metrics, top smart follower counts, best tweets, mindshare comparison, impressions/follower ratio.\n Onchain: Market cap, holder distribution, whale concentration, holder retention, Herfindahl index, high holder count tokens.\n DEX & Trading: 24h volume, top DEX liquidity, buy/sell ratio, price change comparison, high liquidity pairs.\n Overall: Smart engagement/market cap ratio, mindshare/market cap ratio, smart follower percentage comparison across top AI agents.",
35
+ "default": "disabled"
36
+ }
37
+ },
38
+ "description": "States for each Acolyt skill (disabled, public, or private)"
39
+ },
40
+ "api_key_provider": {
41
+ "type": "string",
42
+ "title": "API Key Provider",
43
+ "description": "Who provides the API key",
44
+ "enum": [
45
+ "platform",
46
+ "agent_owner"
47
+ ],
48
+ "x-enum-title": [
49
+ "Nation Hosted",
50
+ "Owner Provided"
51
+ ],
52
+ "default": "platform"
53
+ }
54
+ },
55
+ "required": [
56
+ "states",
57
+ "enabled"
58
+ ],
59
+ "if": {
60
+ "properties": {
61
+ "api_key_provider": {
62
+ "const": "agent_owner"
63
+ }
64
+ }
65
+ },
66
+ "then": {
67
+ "properties": {
68
+ "api_key": {
69
+ "type": "string",
70
+ "title": "Acolyt API Key",
71
+ "x-sensitive": true,
72
+ "description": "Acolyt API key for authentication"
73
+ }
74
+ },
75
+ "if": {
76
+ "properties": {
77
+ "enabled": {
78
+ "const": true
79
+ }
80
+ }
81
+ },
82
+ "then": {
83
+ "required": [
84
+ "api_key"
85
+ ]
86
+ }
87
+ },
88
+ "additionalProperties": true
89
+ }
@@ -0,0 +1,71 @@
1
+ # AIXBT Skill
2
+
3
+ This skill provides access to cryptocurrency project data and analytics through the AIXBT API.
4
+
5
+ ## Features
6
+
7
+ - Search for cryptocurrency projects by name, ticker, or blockchain
8
+ - Get detailed analysis and information about crypto projects
9
+ - Filter projects by minimum score
10
+ - View recent project updates and developments
11
+ - Access project contact information and social media handles
12
+ - Special "alpha" trigger for direct access to crypto research
13
+
14
+ ## Available Skills
15
+
16
+ ### aixbt_projects
17
+
18
+ Searches for cryptocurrency projects and retrieves detailed information about them.
19
+
20
+ #### Special Trigger
21
+
22
+ This skill has a special trigger word: **"alpha"**
23
+
24
+ When a user mentions the word "alpha" anywhere in their message, the AIXBT skill will be automatically triggered. This works with phrases like:
25
+ - "Show me some alpha"
26
+ - "What's the latest alpha on crypto?"
27
+ - "Give me alpha on Bitcoin"
28
+ - "I'm looking for alpha in DeFi projects"
29
+ - Any other message containing the word "alpha"
30
+
31
+ This gives users a convenient way to access crypto research data just by mentioning "alpha" in their questions or requests.
32
+
33
+ #### Parameters
34
+
35
+ | Name | Type | Description | Required | Default |
36
+ |------|------|-------------|----------|---------|
37
+ | limit | integer | Number of projects to return (max 50) | No | 10 |
38
+ | name | string | Filter projects by name (case-insensitive regex match) | No | null |
39
+ | ticker | string | Filter projects by ticker symbol (case-insensitive match) | No | null |
40
+ | xHandle | string | Filter projects by X/Twitter handle | No | null |
41
+ | minScore | number | Minimum score threshold | No | null |
42
+ | chain | string | Filter projects by blockchain | No | null |
43
+
44
+ ## Example Usage
45
+
46
+ ### "Alpha" Trigger Examples
47
+
48
+ **User:** "Show me some alpha"
49
+
50
+ **Agent:** *Uses the aixbt_projects skill to search for trending cryptocurrency projects and provides comprehensive information about them.*
51
+
52
+ **User:** "What's the latest alpha on Bitcoin?"
53
+
54
+ **Agent:** *Uses the aixbt_projects skill to search specifically for Bitcoin and provides detailed information.*
55
+
56
+ ### Standard Query
57
+
58
+ When a user asks about a cryptocurrency project:
59
+
60
+ **User:** "Tell me about the Bitcoin project"
61
+
62
+ **Agent:** *Uses the aixbt_projects skill to search for "bitcoin" and provides information including:*
63
+ - Project score and analysis
64
+ - Recent project updates
65
+ - Social media information
66
+ - Blockchain and token details
67
+
68
+ ## Links
69
+
70
+ - [AIXBT Website](https://aixbt.tech/)
71
+ - [API Documentation](https://api.aixbt.tech/v1/docs/)