intentkit 0.6.13.dev2__py3-none-any.whl → 0.8.17__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 (385) hide show
  1. intentkit/__init__.py +1 -1
  2. intentkit/abstracts/agent.py +4 -5
  3. intentkit/abstracts/engine.py +5 -5
  4. intentkit/abstracts/graph.py +14 -7
  5. intentkit/abstracts/skill.py +6 -144
  6. intentkit/abstracts/twitter.py +4 -5
  7. intentkit/clients/__init__.py +5 -2
  8. intentkit/clients/cdp.py +101 -141
  9. intentkit/clients/twitter.py +83 -62
  10. intentkit/clients/web3.py +29 -0
  11. intentkit/config/config.py +8 -5
  12. intentkit/core/agent.py +472 -195
  13. intentkit/core/asset.py +253 -0
  14. intentkit/core/chat.py +51 -0
  15. intentkit/core/client.py +1 -1
  16. intentkit/core/credit.py +460 -130
  17. intentkit/core/engine.py +262 -233
  18. intentkit/core/node.py +15 -16
  19. intentkit/core/prompt.py +62 -28
  20. intentkit/core/scheduler.py +92 -0
  21. intentkit/core/statistics.py +168 -0
  22. intentkit/models/agent.py +1096 -949
  23. intentkit/models/agent_data.py +68 -38
  24. intentkit/models/agent_public.json +98 -0
  25. intentkit/models/agent_schema.json +54 -439
  26. intentkit/models/app_setting.py +96 -33
  27. intentkit/models/chat.py +74 -27
  28. intentkit/models/conversation.py +8 -8
  29. intentkit/models/credit.py +362 -74
  30. intentkit/models/db.py +26 -8
  31. intentkit/models/db_mig.py +2 -2
  32. intentkit/models/llm.csv +28 -0
  33. intentkit/models/llm.py +185 -350
  34. intentkit/models/redis.py +6 -4
  35. intentkit/models/skill.py +186 -72
  36. intentkit/models/skills.csv +174 -0
  37. intentkit/models/user.py +82 -24
  38. intentkit/skills/acolyt/__init__.py +2 -9
  39. intentkit/skills/acolyt/ask.py +3 -4
  40. intentkit/skills/acolyt/base.py +4 -9
  41. intentkit/skills/acolyt/schema.json +4 -3
  42. intentkit/skills/aixbt/__init__.py +2 -13
  43. intentkit/skills/aixbt/base.py +1 -7
  44. intentkit/skills/aixbt/projects.py +14 -15
  45. intentkit/skills/aixbt/schema.json +4 -4
  46. intentkit/skills/allora/__init__.py +2 -9
  47. intentkit/skills/allora/base.py +4 -9
  48. intentkit/skills/allora/price.py +3 -4
  49. intentkit/skills/allora/schema.json +3 -2
  50. intentkit/skills/base.py +248 -85
  51. intentkit/skills/basename/__init__.py +51 -0
  52. intentkit/skills/basename/base.py +11 -0
  53. intentkit/skills/basename/basename.svg +11 -0
  54. intentkit/skills/basename/schema.json +58 -0
  55. intentkit/skills/carv/__init__.py +115 -121
  56. intentkit/skills/carv/base.py +184 -185
  57. intentkit/skills/carv/fetch_news.py +3 -3
  58. intentkit/skills/carv/onchain_query.py +4 -4
  59. intentkit/skills/carv/schema.json +134 -137
  60. intentkit/skills/carv/token_info_and_price.py +5 -5
  61. intentkit/skills/casino/README.md +254 -0
  62. intentkit/skills/casino/__init__.py +86 -0
  63. intentkit/skills/casino/base.py +17 -0
  64. intentkit/skills/casino/casino.png +0 -0
  65. intentkit/skills/casino/deck_draw.py +127 -0
  66. intentkit/skills/casino/deck_shuffle.py +118 -0
  67. intentkit/skills/casino/dice_roll.py +100 -0
  68. intentkit/skills/casino/schema.json +77 -0
  69. intentkit/skills/casino/utils.py +107 -0
  70. intentkit/skills/cdp/__init__.py +22 -84
  71. intentkit/skills/cdp/base.py +1 -7
  72. intentkit/skills/cdp/schema.json +11 -314
  73. intentkit/skills/chainlist/__init__.py +2 -7
  74. intentkit/skills/chainlist/base.py +1 -7
  75. intentkit/skills/chainlist/chain_lookup.py +18 -18
  76. intentkit/skills/chainlist/schema.json +3 -5
  77. intentkit/skills/common/__init__.py +2 -9
  78. intentkit/skills/common/base.py +1 -7
  79. intentkit/skills/common/current_time.py +1 -2
  80. intentkit/skills/common/schema.json +2 -2
  81. intentkit/skills/cookiefun/__init__.py +6 -9
  82. intentkit/skills/cookiefun/base.py +2 -7
  83. intentkit/skills/cookiefun/get_account_details.py +7 -7
  84. intentkit/skills/cookiefun/get_account_feed.py +19 -19
  85. intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
  86. intentkit/skills/cookiefun/get_sectors.py +3 -3
  87. intentkit/skills/cookiefun/schema.json +1 -3
  88. intentkit/skills/cookiefun/search_accounts.py +9 -9
  89. intentkit/skills/cryptocompare/__init__.py +7 -24
  90. intentkit/skills/cryptocompare/api.py +2 -3
  91. intentkit/skills/cryptocompare/base.py +11 -25
  92. intentkit/skills/cryptocompare/fetch_news.py +4 -5
  93. intentkit/skills/cryptocompare/fetch_price.py +6 -7
  94. intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
  95. intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
  96. intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
  97. intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
  98. intentkit/skills/cryptocompare/schema.json +3 -3
  99. intentkit/skills/cryptopanic/__init__.py +7 -10
  100. intentkit/skills/cryptopanic/base.py +51 -55
  101. intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
  102. intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
  103. intentkit/skills/cryptopanic/schema.json +105 -103
  104. intentkit/skills/dapplooker/__init__.py +2 -9
  105. intentkit/skills/dapplooker/base.py +4 -9
  106. intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
  107. intentkit/skills/dapplooker/schema.json +3 -5
  108. intentkit/skills/defillama/__init__.py +24 -74
  109. intentkit/skills/defillama/api.py +6 -9
  110. intentkit/skills/defillama/base.py +11 -21
  111. intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
  112. intentkit/skills/defillama/coins/fetch_block.py +6 -8
  113. intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
  114. intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
  115. intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
  116. intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
  117. intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
  118. intentkit/skills/defillama/config/chains.py +1 -3
  119. intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
  120. intentkit/skills/defillama/schema.json +5 -1
  121. intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
  122. intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
  123. intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
  124. intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
  125. intentkit/skills/defillama/tests/api_integration.test.py +1 -1
  126. intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
  127. intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
  128. intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
  129. intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
  130. intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
  131. intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
  132. intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
  133. intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
  134. intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
  135. intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
  136. intentkit/skills/defillama/yields/fetch_pools.py +26 -30
  137. intentkit/skills/dexscreener/README.md +154 -0
  138. intentkit/skills/dexscreener/__init__.py +97 -93
  139. intentkit/skills/dexscreener/base.py +125 -133
  140. intentkit/skills/dexscreener/get_pair_info.py +158 -0
  141. intentkit/skills/dexscreener/get_token_pairs.py +165 -0
  142. intentkit/skills/dexscreener/get_tokens_info.py +212 -0
  143. intentkit/skills/dexscreener/model/search_token_response.py +80 -82
  144. intentkit/skills/dexscreener/schema.json +91 -48
  145. intentkit/skills/dexscreener/search_token.py +182 -321
  146. intentkit/skills/dexscreener/utils.py +420 -0
  147. intentkit/skills/dune_analytics/__init__.py +7 -9
  148. intentkit/skills/dune_analytics/base.py +48 -52
  149. intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
  150. intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
  151. intentkit/skills/dune_analytics/schema.json +104 -99
  152. intentkit/skills/elfa/__init__.py +5 -18
  153. intentkit/skills/elfa/base.py +10 -14
  154. intentkit/skills/elfa/mention.py +19 -21
  155. intentkit/skills/elfa/schema.json +3 -2
  156. intentkit/skills/elfa/stats.py +4 -4
  157. intentkit/skills/elfa/tokens.py +12 -12
  158. intentkit/skills/elfa/utils.py +26 -28
  159. intentkit/skills/enso/__init__.py +11 -31
  160. intentkit/skills/enso/base.py +50 -35
  161. intentkit/skills/enso/best_yield.py +16 -24
  162. intentkit/skills/enso/networks.py +6 -11
  163. intentkit/skills/enso/prices.py +11 -13
  164. intentkit/skills/enso/route.py +34 -38
  165. intentkit/skills/enso/schema.json +3 -2
  166. intentkit/skills/enso/tokens.py +29 -38
  167. intentkit/skills/enso/wallet.py +76 -191
  168. intentkit/skills/erc20/__init__.py +50 -0
  169. intentkit/skills/erc20/base.py +11 -0
  170. intentkit/skills/erc20/erc20.svg +5 -0
  171. intentkit/skills/erc20/schema.json +74 -0
  172. intentkit/skills/erc721/__init__.py +53 -0
  173. intentkit/skills/erc721/base.py +11 -0
  174. intentkit/skills/erc721/erc721.svg +5 -0
  175. intentkit/skills/erc721/schema.json +90 -0
  176. intentkit/skills/firecrawl/README.md +11 -5
  177. intentkit/skills/firecrawl/__init__.py +5 -18
  178. intentkit/skills/firecrawl/base.py +4 -11
  179. intentkit/skills/firecrawl/clear.py +4 -8
  180. intentkit/skills/firecrawl/crawl.py +19 -19
  181. intentkit/skills/firecrawl/query.py +4 -3
  182. intentkit/skills/firecrawl/schema.json +6 -8
  183. intentkit/skills/firecrawl/scrape.py +150 -40
  184. intentkit/skills/firecrawl/utils.py +50 -42
  185. intentkit/skills/github/__init__.py +2 -7
  186. intentkit/skills/github/base.py +1 -7
  187. intentkit/skills/github/github_search.py +1 -2
  188. intentkit/skills/github/schema.json +3 -4
  189. intentkit/skills/heurist/__init__.py +8 -27
  190. intentkit/skills/heurist/base.py +4 -9
  191. intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
  192. intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
  193. intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
  194. intentkit/skills/heurist/image_generation_braindance.py +12 -13
  195. intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
  196. intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
  197. intentkit/skills/heurist/image_generation_sdxl.py +12 -13
  198. intentkit/skills/heurist/schema.json +2 -2
  199. intentkit/skills/http/__init__.py +4 -15
  200. intentkit/skills/http/base.py +1 -7
  201. intentkit/skills/http/get.py +21 -16
  202. intentkit/skills/http/post.py +23 -18
  203. intentkit/skills/http/put.py +23 -18
  204. intentkit/skills/http/schema.json +4 -5
  205. intentkit/skills/lifi/__init__.py +8 -13
  206. intentkit/skills/lifi/base.py +1 -7
  207. intentkit/skills/lifi/schema.json +17 -8
  208. intentkit/skills/lifi/token_execute.py +36 -30
  209. intentkit/skills/lifi/token_quote.py +8 -10
  210. intentkit/skills/lifi/utils.py +104 -51
  211. intentkit/skills/moralis/__init__.py +6 -10
  212. intentkit/skills/moralis/api.py +6 -7
  213. intentkit/skills/moralis/base.py +5 -10
  214. intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
  215. intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
  216. intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
  217. intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
  218. intentkit/skills/moralis/schema.json +7 -2
  219. intentkit/skills/morpho/__init__.py +52 -0
  220. intentkit/skills/morpho/base.py +11 -0
  221. intentkit/skills/morpho/morpho.svg +12 -0
  222. intentkit/skills/morpho/schema.json +73 -0
  223. intentkit/skills/nation/__init__.py +4 -9
  224. intentkit/skills/nation/base.py +5 -10
  225. intentkit/skills/nation/nft_check.py +3 -4
  226. intentkit/skills/nation/schema.json +4 -3
  227. intentkit/skills/onchain.py +23 -0
  228. intentkit/skills/openai/__init__.py +17 -18
  229. intentkit/skills/openai/base.py +10 -14
  230. intentkit/skills/openai/dalle_image_generation.py +3 -8
  231. intentkit/skills/openai/gpt_avatar_generator.py +102 -0
  232. intentkit/skills/openai/gpt_image_generation.py +4 -8
  233. intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
  234. intentkit/skills/openai/gpt_image_to_image.py +4 -8
  235. intentkit/skills/openai/image_to_text.py +3 -7
  236. intentkit/skills/openai/schema.json +34 -3
  237. intentkit/skills/portfolio/__init__.py +11 -35
  238. intentkit/skills/portfolio/base.py +33 -19
  239. intentkit/skills/portfolio/schema.json +3 -5
  240. intentkit/skills/portfolio/token_balances.py +21 -21
  241. intentkit/skills/portfolio/wallet_approvals.py +17 -18
  242. intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
  243. intentkit/skills/portfolio/wallet_history.py +31 -31
  244. intentkit/skills/portfolio/wallet_net_worth.py +13 -13
  245. intentkit/skills/portfolio/wallet_nfts.py +19 -19
  246. intentkit/skills/portfolio/wallet_profitability.py +18 -18
  247. intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
  248. intentkit/skills/portfolio/wallet_stats.py +3 -3
  249. intentkit/skills/portfolio/wallet_swaps.py +19 -19
  250. intentkit/skills/pyth/__init__.py +50 -0
  251. intentkit/skills/pyth/base.py +11 -0
  252. intentkit/skills/pyth/pyth.svg +6 -0
  253. intentkit/skills/pyth/schema.json +75 -0
  254. intentkit/skills/skills.toml +40 -0
  255. intentkit/skills/slack/__init__.py +5 -17
  256. intentkit/skills/slack/base.py +3 -9
  257. intentkit/skills/slack/get_channel.py +8 -8
  258. intentkit/skills/slack/get_message.py +9 -9
  259. intentkit/skills/slack/schedule_message.py +5 -5
  260. intentkit/skills/slack/schema.json +2 -2
  261. intentkit/skills/slack/send_message.py +3 -5
  262. intentkit/skills/supabase/__init__.py +7 -23
  263. intentkit/skills/supabase/base.py +9 -13
  264. intentkit/skills/supabase/delete_data.py +5 -6
  265. intentkit/skills/supabase/fetch_data.py +13 -14
  266. intentkit/skills/supabase/insert_data.py +5 -6
  267. intentkit/skills/supabase/invoke_function.py +7 -8
  268. intentkit/skills/supabase/schema.json +2 -3
  269. intentkit/skills/supabase/update_data.py +7 -8
  270. intentkit/skills/supabase/upsert_data.py +5 -6
  271. intentkit/skills/superfluid/__init__.py +53 -0
  272. intentkit/skills/superfluid/base.py +11 -0
  273. intentkit/skills/superfluid/schema.json +89 -0
  274. intentkit/skills/superfluid/superfluid.svg +6 -0
  275. intentkit/skills/system/__init__.py +7 -24
  276. intentkit/skills/system/add_autonomous_task.py +10 -12
  277. intentkit/skills/system/delete_autonomous_task.py +2 -2
  278. intentkit/skills/system/edit_autonomous_task.py +14 -18
  279. intentkit/skills/system/list_autonomous_tasks.py +3 -5
  280. intentkit/skills/system/read_agent_api_key.py +6 -4
  281. intentkit/skills/system/regenerate_agent_api_key.py +6 -4
  282. intentkit/skills/system/schema.json +6 -8
  283. intentkit/skills/tavily/__init__.py +3 -12
  284. intentkit/skills/tavily/base.py +4 -9
  285. intentkit/skills/tavily/schema.json +3 -5
  286. intentkit/skills/tavily/tavily_extract.py +2 -4
  287. intentkit/skills/tavily/tavily_search.py +4 -6
  288. intentkit/skills/token/__init__.py +5 -10
  289. intentkit/skills/token/base.py +7 -11
  290. intentkit/skills/token/erc20_transfers.py +19 -19
  291. intentkit/skills/token/schema.json +3 -6
  292. intentkit/skills/token/token_analytics.py +3 -3
  293. intentkit/skills/token/token_price.py +13 -13
  294. intentkit/skills/token/token_search.py +9 -9
  295. intentkit/skills/twitter/__init__.py +11 -35
  296. intentkit/skills/twitter/base.py +23 -35
  297. intentkit/skills/twitter/follow_user.py +3 -7
  298. intentkit/skills/twitter/get_mentions.py +6 -13
  299. intentkit/skills/twitter/get_timeline.py +5 -13
  300. intentkit/skills/twitter/get_user_by_username.py +3 -7
  301. intentkit/skills/twitter/get_user_tweets.py +6 -14
  302. intentkit/skills/twitter/like_tweet.py +3 -7
  303. intentkit/skills/twitter/post_tweet.py +23 -12
  304. intentkit/skills/twitter/reply_tweet.py +21 -12
  305. intentkit/skills/twitter/retweet.py +3 -7
  306. intentkit/skills/twitter/schema.json +1 -0
  307. intentkit/skills/twitter/search_tweets.py +5 -13
  308. intentkit/skills/unrealspeech/__init__.py +2 -7
  309. intentkit/skills/unrealspeech/base.py +2 -8
  310. intentkit/skills/unrealspeech/schema.json +2 -5
  311. intentkit/skills/unrealspeech/text_to_speech.py +8 -8
  312. intentkit/skills/venice_audio/__init__.py +98 -106
  313. intentkit/skills/venice_audio/base.py +117 -121
  314. intentkit/skills/venice_audio/input.py +41 -41
  315. intentkit/skills/venice_audio/schema.json +151 -152
  316. intentkit/skills/venice_audio/venice_audio.py +38 -21
  317. intentkit/skills/venice_image/__init__.py +147 -154
  318. intentkit/skills/venice_image/api.py +138 -138
  319. intentkit/skills/venice_image/base.py +185 -192
  320. intentkit/skills/venice_image/config.py +33 -35
  321. intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
  322. intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
  323. intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
  324. intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
  325. intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
  326. intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
  327. intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
  328. intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
  329. intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
  330. intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
  331. intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
  332. intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
  333. intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
  334. intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
  335. intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
  336. intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
  337. intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
  338. intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
  339. intentkit/skills/venice_image/schema.json +267 -267
  340. intentkit/skills/venice_image/utils.py +77 -78
  341. intentkit/skills/web_scraper/__init__.py +5 -18
  342. intentkit/skills/web_scraper/base.py +21 -7
  343. intentkit/skills/web_scraper/document_indexer.py +7 -6
  344. intentkit/skills/web_scraper/schema.json +2 -6
  345. intentkit/skills/web_scraper/scrape_and_index.py +15 -15
  346. intentkit/skills/web_scraper/utils.py +62 -63
  347. intentkit/skills/web_scraper/website_indexer.py +17 -19
  348. intentkit/skills/weth/__init__.py +49 -0
  349. intentkit/skills/weth/base.py +11 -0
  350. intentkit/skills/weth/schema.json +58 -0
  351. intentkit/skills/weth/weth.svg +6 -0
  352. intentkit/skills/wow/__init__.py +51 -0
  353. intentkit/skills/wow/base.py +11 -0
  354. intentkit/skills/wow/schema.json +89 -0
  355. intentkit/skills/wow/wow.svg +7 -0
  356. intentkit/skills/x402/__init__.py +61 -0
  357. intentkit/skills/x402/ask_agent.py +98 -0
  358. intentkit/skills/x402/base.py +99 -0
  359. intentkit/skills/x402/http_request.py +117 -0
  360. intentkit/skills/x402/schema.json +45 -0
  361. intentkit/skills/x402/x402.webp +0 -0
  362. intentkit/skills/xmtp/__init__.py +4 -15
  363. intentkit/skills/xmtp/base.py +61 -2
  364. intentkit/skills/xmtp/price.py +18 -13
  365. intentkit/skills/xmtp/schema.json +69 -71
  366. intentkit/skills/xmtp/swap.py +22 -25
  367. intentkit/skills/xmtp/transfer.py +71 -32
  368. intentkit/utils/chain.py +3 -3
  369. intentkit/utils/error.py +14 -1
  370. intentkit/utils/logging.py +2 -4
  371. intentkit/utils/s3.py +59 -7
  372. intentkit/utils/schema.py +100 -0
  373. intentkit/utils/slack_alert.py +7 -8
  374. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
  375. intentkit-0.8.17.dist-info/RECORD +466 -0
  376. intentkit/abstracts/exception.py +0 -9
  377. intentkit/core/skill.py +0 -200
  378. intentkit/models/generator.py +0 -347
  379. intentkit/skills/cdp/get_balance.py +0 -110
  380. intentkit/skills/cdp/swap.py +0 -121
  381. intentkit/skills/moralis/tests/__init__.py +0 -0
  382. intentkit/skills/moralis/tests/test_wallet.py +0 -511
  383. intentkit-0.6.13.dev2.dist-info/RECORD +0 -409
  384. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
  385. {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
intentkit/models/user.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import logging
2
- from datetime import datetime, timezone
3
- from decimal import Decimal
4
- from typing import Annotated, Optional, Type, TypeVar
2
+ from datetime import UTC, datetime
3
+ from decimal import ROUND_HALF_UP, Decimal
4
+ from typing import Annotated, TypeVar
5
5
 
6
6
  from intentkit.models.base import Base
7
7
  from intentkit.models.credit import CreditAccount
@@ -13,7 +13,6 @@ from sqlalchemy.ext.asyncio import AsyncSession
13
13
 
14
14
  logger = logging.getLogger(__name__)
15
15
 
16
-
17
16
  # TypeVar for User model constraint
18
17
  UserModelType = TypeVar("UserModelType", bound="User")
19
18
  UserTableType = TypeVar("UserTableType", bound="UserTable")
@@ -23,10 +22,10 @@ class UserRegistry:
23
22
  """Registry for extended model classes."""
24
23
 
25
24
  def __init__(self):
26
- self._user_table_class: Optional[Type[UserTableType]] = None
27
- self._user_model_class: Optional[Type[UserModelType]] = None
25
+ self._user_table_class: type[UserTableType] | None = None
26
+ self._user_model_class: type[UserModelType] | None = None
28
27
 
29
- def register_user_table(self, user_table_class: Type[UserTableType]) -> None:
28
+ def register_user_table(self, user_table_class: type[UserTableType]) -> None:
30
29
  """Register extended UserTable class.
31
30
 
32
31
  Args:
@@ -34,11 +33,11 @@ class UserRegistry:
34
33
  """
35
34
  self._user_table_class = user_table_class
36
35
 
37
- def get_user_table_class(self) -> Type[UserTableType]:
36
+ def get_user_table_class(self) -> type[UserTableType]:
38
37
  """Get registered UserTable class or default."""
39
38
  return self._user_table_class or UserTable
40
39
 
41
- def register_user_model(self, user_model_class: Type[UserModelType]) -> None:
40
+ def register_user_model(self, user_model_class: type[UserModelType]) -> None:
42
41
  """Register extended UserModel class.
43
42
 
44
43
  Args:
@@ -46,7 +45,7 @@ class UserRegistry:
46
45
  """
47
46
  self._user_model_class = user_model_class
48
47
 
49
- def get_user_model_class(self) -> Type[UserModelType]:
48
+ def get_user_model_class(self) -> type[UserModelType]:
50
49
  """Get registered UserModel class or default."""
51
50
  return self._user_model_class or User
52
51
 
@@ -93,6 +92,18 @@ class UserTable(Base):
93
92
  JSON().with_variant(JSONB(), "postgresql"),
94
93
  nullable=True,
95
94
  )
95
+ evm_wallet_address = Column(
96
+ String,
97
+ nullable=True,
98
+ )
99
+ solana_wallet_address = Column(
100
+ String,
101
+ nullable=True,
102
+ )
103
+ linked_accounts = Column(
104
+ JSON().with_variant(JSONB(), "postgresql"),
105
+ nullable=True,
106
+ )
96
107
  created_at = Column(
97
108
  DateTime(timezone=True),
98
109
  nullable=False,
@@ -102,7 +113,7 @@ class UserTable(Base):
102
113
  DateTime(timezone=True),
103
114
  nullable=False,
104
115
  server_default=func.now(),
105
- onupdate=lambda: datetime.now(timezone.utc),
116
+ onupdate=lambda: datetime.now(UTC),
106
117
  )
107
118
 
108
119
 
@@ -119,18 +130,27 @@ class UserUpdate(BaseModel):
119
130
  nft_count: Annotated[
120
131
  int, Field(default=0, description="Number of NFTs owned by the user")
121
132
  ]
122
- email: Annotated[Optional[str], Field(None, description="User's email address")]
133
+ email: Annotated[str | None, Field(None, description="User's email address")]
123
134
  x_username: Annotated[
124
- Optional[str], Field(None, description="User's X (Twitter) username")
135
+ str | None, Field(None, description="User's X (Twitter) username")
125
136
  ]
126
137
  github_username: Annotated[
127
- Optional[str], Field(None, description="User's GitHub username")
138
+ str | None, Field(None, description="User's GitHub username")
128
139
  ]
129
140
  telegram_username: Annotated[
130
- Optional[str], Field(None, description="User's Telegram username")
141
+ str | None, Field(None, description="User's Telegram username")
131
142
  ]
132
143
  extra: Annotated[
133
- Optional[dict], Field(None, description="Additional user information")
144
+ dict | None, Field(None, description="Additional user information")
145
+ ]
146
+ evm_wallet_address: Annotated[
147
+ str | None, Field(None, description="User's EVM wallet address")
148
+ ]
149
+ solana_wallet_address: Annotated[
150
+ str | None, Field(None, description="User's Solana wallet address")
151
+ ]
152
+ linked_accounts: Annotated[
153
+ dict | None, Field(None, description="User's linked accounts information")
134
154
  ]
135
155
 
136
156
  async def _update_quota_for_nft_count(
@@ -144,12 +164,17 @@ class UserUpdate(BaseModel):
144
164
  new_nft_count: Current NFT count
145
165
  """
146
166
  # Generate upstream_tx_id
147
- timestamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S")
167
+ timestamp = datetime.now(UTC).strftime("%Y%m%d%H%M%S")
148
168
  upstream_tx_id = f"nft_{id}_{timestamp}"
149
169
 
150
170
  # Calculate new quota values based on nft_count
151
- free_quota = Decimal(480 + 48 * new_nft_count)
152
- refill_amount = Decimal(20 + 2 * new_nft_count)
171
+ FOURPLACES = Decimal("0.0001")
172
+ free_quota = Decimal(480 + 48 * new_nft_count).quantize(
173
+ FOURPLACES, rounding=ROUND_HALF_UP
174
+ )
175
+ refill_amount = Decimal(20 + 2 * new_nft_count).quantize(
176
+ FOURPLACES, rounding=ROUND_HALF_UP
177
+ )
153
178
  note = f"NFT count changed to {new_nft_count}"
154
179
 
155
180
  # Update daily quota
@@ -165,7 +190,7 @@ class UserUpdate(BaseModel):
165
190
  note=note,
166
191
  )
167
192
 
168
- async def patch(self, id: str) -> "User":
193
+ async def patch(self, id: str) -> UserModelType:
169
194
  """Update only the provided fields of a user in the database.
170
195
  If the user doesn't exist, create a new one with the provided ID and fields.
171
196
  If nft_count changes, update the daily quota accordingly.
@@ -177,7 +202,9 @@ class UserUpdate(BaseModel):
177
202
  Updated or newly created User model
178
203
  """
179
204
  user_model_class = user_model_registry.get_user_model_class()
205
+ assert issubclass(user_model_class, User)
180
206
  user_table_class = user_model_registry.get_user_table_class()
207
+ assert issubclass(user_table_class, UserTable)
181
208
  async with get_session() as db:
182
209
  db_user = await db.get(user_table_class, id)
183
210
  old_nft_count = 0 # Default for new users
@@ -203,7 +230,7 @@ class UserUpdate(BaseModel):
203
230
 
204
231
  return user_model_class.model_validate(db_user)
205
232
 
206
- async def put(self, id: str) -> "User":
233
+ async def put(self, id: str) -> UserModelType:
207
234
  """Replace all fields of a user in the database with the provided values.
208
235
  If the user doesn't exist, create a new one with the provided ID and fields.
209
236
  If nft_count changes, update the daily quota accordingly.
@@ -215,7 +242,9 @@ class UserUpdate(BaseModel):
215
242
  Updated or newly created User model
216
243
  """
217
244
  user_model_class = user_model_registry.get_user_model_class()
245
+ assert issubclass(user_model_class, User)
218
246
  user_table_class = user_model_registry.get_user_table_class()
247
+ assert issubclass(user_table_class, UserTable)
219
248
  async with get_session() as db:
220
249
  db_user = await db.get(user_table_class, id)
221
250
  old_nft_count = 0 # Default for new users
@@ -256,7 +285,7 @@ class User(UserUpdate):
256
285
  ]
257
286
 
258
287
  @classmethod
259
- async def get(cls, user_id: str) -> Optional["User"]:
288
+ async def get(cls, user_id: str) -> UserModelType | None:
260
289
  """Get a user by ID.
261
290
 
262
291
  Args:
@@ -271,7 +300,7 @@ class User(UserUpdate):
271
300
  @classmethod
272
301
  async def get_in_session(
273
302
  cls, session: AsyncSession, user_id: str
274
- ) -> Optional["User"]:
303
+ ) -> UserModelType | None:
275
304
  """Get a user by ID using the provided session.
276
305
 
277
306
  Args:
@@ -281,11 +310,40 @@ class User(UserUpdate):
281
310
  Returns:
282
311
  User model or None if not found
283
312
  """
313
+ user_model_class = user_model_registry.get_user_model_class()
314
+ assert issubclass(user_model_class, User)
284
315
  user_table_class = user_model_registry.get_user_table_class()
316
+ assert issubclass(user_table_class, UserTable)
285
317
  result = await session.execute(
286
318
  select(user_table_class).where(user_table_class.id == user_id)
287
319
  )
288
320
  user = result.scalars().first()
289
321
  if user is None:
290
322
  return None
291
- return cls.model_validate(user)
323
+ return user_model_class.model_validate(user)
324
+
325
+ @classmethod
326
+ async def get_by_tg(cls, telegram_username: str) -> UserModelType | None:
327
+ """Get a user by telegram username.
328
+
329
+ Args:
330
+ telegram_username: Telegram username of the user to get
331
+
332
+ Returns:
333
+ User model or None if not found
334
+ """
335
+ user_model_class = user_model_registry.get_user_model_class()
336
+ assert issubclass(user_model_class, User)
337
+ user_table_class = user_model_registry.get_user_table_class()
338
+ assert issubclass(user_table_class, UserTable)
339
+
340
+ async with get_session() as session:
341
+ result = await session.execute(
342
+ select(user_table_class).where(
343
+ user_table_class.telegram_username == telegram_username
344
+ )
345
+ )
346
+ user = result.scalars().first()
347
+ if user is None:
348
+ return None
349
+ return user_model_class.model_validate(user)
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import NotRequired, TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.acolyt.ask import AcolytAskGpt
8
7
  from intentkit.skills.acolyt.base import AcolytBaseTool
9
8
  from intentkit.skills.base import SkillConfig, SkillState
@@ -28,7 +27,6 @@ class Config(SkillConfig):
28
27
  async def get_skills(
29
28
  config: "Config",
30
29
  is_private: bool,
31
- store: SkillStoreABC,
32
30
  **_,
33
31
  ) -> list[AcolytBaseTool]:
34
32
  """Get all Acolyt skills.
@@ -36,7 +34,6 @@ async def get_skills(
36
34
  Args:
37
35
  config: The configuration for Acolyt skills.
38
36
  is_private: Whether to include private skills.
39
- store: The skill store for persisting data.
40
37
 
41
38
  Returns:
42
39
  A list of Acolyt skills.
@@ -53,7 +50,7 @@ async def get_skills(
53
50
  # Get each skill using the cached getter
54
51
  result = []
55
52
  for name in available_skills:
56
- skill = get_acolyt_skill(name, store)
53
+ skill = get_acolyt_skill(name)
57
54
  if skill:
58
55
  result.append(skill)
59
56
  return result
@@ -61,22 +58,18 @@ async def get_skills(
61
58
 
62
59
  def get_acolyt_skill(
63
60
  name: str,
64
- store: SkillStoreABC,
65
61
  ) -> AcolytBaseTool | None:
66
62
  """Get an Acolyt skill by name.
67
63
 
68
64
  Args:
69
65
  name: The name of the skill to get
70
- store: The skill store for persisting data
71
66
 
72
67
  Returns:
73
68
  The requested Acolyt skill
74
69
  """
75
70
  if name == "ask_gpt":
76
71
  if name not in _cache:
77
- _cache[name] = AcolytAskGpt(
78
- skill_store=store,
79
- )
72
+ _cache[name] = AcolytAskGpt()
80
73
  return _cache[name]
81
74
  else:
82
75
  logger.warning(f"Unknown Acolyt skill: {name}")
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Dict, Literal, Type
2
+ from typing import Literal
3
3
 
4
4
  import httpx
5
5
  from pydantic import BaseModel, Field
@@ -48,7 +48,6 @@ class AcolytAskGpt(AcolytBaseTool):
48
48
  - 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.
49
49
  - 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
50
50
 
51
-
52
51
  Attributes:
53
52
  name (str): Name of the tool, specifically "acolyt_ask_gpt".
54
53
  description (str): Comprehensive description of the tool's purpose and functionality.
@@ -64,9 +63,9 @@ class AcolytAskGpt(AcolytBaseTool):
64
63
  DEX & Trading: 24h volume, top DEX liquidity, buy/sell ratio, price change comparison, high liquidity pairs.
65
64
  Overall: Smart engagement/market cap ratio, mindshare/market cap ratio, smart follower percentage comparison across top AI agents.
66
65
  """
67
- args_schema: Type[BaseModel] = AcolytAskGptInput
66
+ args_schema: type[BaseModel] = AcolytAskGptInput
68
67
 
69
- async def _arun(self, question: str, **kwargs) -> Dict:
68
+ async def _arun(self, question: str, **kwargs) -> dict:
70
69
  """Run the tool to get answer from Acolyt GPT.
71
70
 
72
71
  Args:
@@ -1,9 +1,7 @@
1
- from typing import Type
2
-
3
- from langchain.tools.base import ToolException
1
+ from langchain_core.tools.base import ToolException
4
2
  from pydantic import BaseModel, Field
5
3
 
6
- from intentkit.abstracts.skill import SkillStoreABC
4
+ from intentkit.config.config import config
7
5
  from intentkit.skills.base import IntentKitSkill
8
6
 
9
7
  base_url = "https://acolyt-oracle-poc.vercel.app"
@@ -14,17 +12,14 @@ class AcolytBaseTool(IntentKitSkill):
14
12
 
15
13
  name: str = Field(description="The name of the tool")
16
14
  description: str = Field(description="A description of what the tool does")
17
- args_schema: Type[BaseModel]
18
- skill_store: SkillStoreABC = Field(
19
- description="The skill store for persisting data"
20
- )
15
+ args_schema: type[BaseModel]
21
16
 
22
17
  def get_api_key(self) -> str:
23
18
  context = self.get_context()
24
19
  skill_config = context.agent.skill_config(self.category)
25
20
  api_key_provider = skill_config.get("api_key_provider")
26
21
  if api_key_provider == "platform":
27
- return self.skill_store.get_system_config("acolyt_api_key")
22
+ return config.acolyt_api_key
28
23
  # for backward compatibility, may only have api_key in skill_config
29
24
  elif skill_config.get("api_key"):
30
25
  return skill_config.get("api_key")
@@ -5,8 +5,9 @@
5
5
  "description": "Integration with Acolyt Oracle providing blockchain oracle services for accessing and verifying off-chain data with secure API connections",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/acolyt/acolyt.jpg",
7
7
  "x-tags": [
8
- "Blockchain",
9
- "Oracle"
8
+ "Analytics",
9
+ "Crypto",
10
+ "DeFi"
10
11
  ],
11
12
  "properties": {
12
13
  "enabled": {
@@ -86,4 +87,4 @@
86
87
  }
87
88
  },
88
89
  "additionalProperties": true
89
- }
90
+ }
@@ -1,6 +1,5 @@
1
1
  from typing import TypedDict
2
2
 
3
- from intentkit.abstracts.skill import SkillStoreABC
4
3
  from intentkit.skills.aixbt.base import AIXBTBaseTool
5
4
  from intentkit.skills.aixbt.projects import AIXBTProjects
6
5
  from intentkit.skills.base import SkillConfig, SkillState
@@ -27,7 +26,6 @@ class Config(SkillConfig):
27
26
  async def get_skills(
28
27
  config: "Config",
29
28
  is_private: bool,
30
- store: SkillStoreABC,
31
29
  **_,
32
30
  ) -> list[AIXBTBaseTool]:
33
31
  """Get all AIXBT API skills."""
@@ -44,26 +42,17 @@ async def get_skills(
44
42
  available_skills.append(skill_name)
45
43
 
46
44
  # Get each skill using the cached getter
47
- return [
48
- get_aixbt_skill(
49
- name=name,
50
- store=store,
51
- )
52
- for name in available_skills
53
- ]
45
+ return [get_aixbt_skill(name) for name in available_skills]
54
46
 
55
47
 
56
48
  def get_aixbt_skill(
57
49
  name: str,
58
- store: SkillStoreABC,
59
50
  ) -> AIXBTBaseTool:
60
51
  """Get an AIXBT API skill by name."""
61
52
 
62
53
  if name == "aixbt_projects":
63
54
  if name not in _cache:
64
- _cache[name] = AIXBTProjects(
65
- skill_store=store,
66
- )
55
+ _cache[name] = AIXBTProjects()
67
56
  return _cache[name]
68
57
  else:
69
58
  raise ValueError(f"Unknown AIXBT skill: {name}")
@@ -1,8 +1,5 @@
1
- from typing import Type
2
-
3
1
  from pydantic import BaseModel, Field
4
2
 
5
- from intentkit.abstracts.skill import SkillStoreABC
6
3
  from intentkit.skills.base import IntentKitSkill
7
4
 
8
5
 
@@ -11,10 +8,7 @@ class AIXBTBaseTool(IntentKitSkill):
11
8
 
12
9
  name: str = Field(description="The name of the tool")
13
10
  description: str = Field(description="A description of what the tool does")
14
- args_schema: Type[BaseModel]
15
- skill_store: SkillStoreABC = Field(
16
- description="The skill store for persisting data"
17
- )
11
+ args_schema: type[BaseModel]
18
12
 
19
13
  @property
20
14
  def category(self) -> str:
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Any, Dict, Optional, Type
2
+ from typing import Any
3
3
 
4
4
  import httpx
5
5
  from langchain_core.tools import ToolException
@@ -17,23 +17,23 @@ class ProjectsInput(BaseModel):
17
17
  default=10,
18
18
  description="Number of projects to return (max 50)",
19
19
  )
20
- name: Optional[str] = Field(
20
+ name: str | None = Field(
21
21
  default=None,
22
22
  description="Filter projects by name (case-insensitive regex match)",
23
23
  )
24
- ticker: Optional[str] = Field(
24
+ ticker: str | None = Field(
25
25
  default=None,
26
26
  description="Filter projects by ticker symbol (case-insensitive match)",
27
27
  )
28
- xHandle: Optional[str] = Field(
28
+ xHandle: str | None = Field(
29
29
  default=None,
30
30
  description="Filter projects by X/Twitter handle",
31
31
  )
32
- minScore: Optional[float] = Field(
32
+ minScore: float | None = Field(
33
33
  default=None,
34
34
  description="Minimum score threshold",
35
35
  )
36
- chain: Optional[str] = Field(
36
+ chain: str | None = Field(
37
37
  default=None,
38
38
  description="Filter projects by blockchain",
39
39
  )
@@ -53,18 +53,18 @@ class AIXBTProjects(AIXBTBaseTool):
53
53
  "detailed information on recent developments. The 'alpha' keyword is a trigger "
54
54
  "for accessing AIXBT's specific dataset for crypto research."
55
55
  )
56
- args_schema: Type[BaseModel] = ProjectsInput
56
+ args_schema: type[BaseModel] = ProjectsInput
57
57
 
58
58
  async def _arun(
59
59
  self,
60
60
  limit: int = 10,
61
- name: Optional[str] = None,
62
- ticker: Optional[str] = None,
63
- xHandle: Optional[str] = None,
64
- minScore: Optional[float] = None,
65
- chain: Optional[str] = None,
61
+ name: str | None = None,
62
+ ticker: str | None = None,
63
+ xHandle: str | None = None,
64
+ minScore: float | None = None,
65
+ chain: str | None = None,
66
66
  **kwargs,
67
- ) -> Dict[str, Any]:
67
+ ) -> dict[str, Any]:
68
68
  """
69
69
  Search for cryptocurrency projects using AIXBT API.
70
70
 
@@ -89,9 +89,8 @@ class AIXBTProjects(AIXBTBaseTool):
89
89
  "rate_limit_minutes"
90
90
  ):
91
91
  await self.user_rate_limit_by_category(
92
- context.user_id,
93
92
  skill_config["rate_limit_number"],
94
- skill_config["rate_limit_minutes"],
93
+ skill_config["rate_limit_minutes"] * 60,
95
94
  )
96
95
 
97
96
  # Get the API key from the agent's configuration
@@ -5,9 +5,9 @@
5
5
  "description": "Cryptocurrency project data and analytics through the AIXBT API",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/aixbt/aixbt.jpg",
7
7
  "x-tags": [
8
- "Cryptocurrency",
9
- "Research",
10
- "Analytics"
8
+ "Analytics",
9
+ "Crypto",
10
+ "Knowledge Base"
11
11
  ],
12
12
  "properties": {
13
13
  "enabled": {
@@ -96,4 +96,4 @@
96
96
  }
97
97
  },
98
98
  "additionalProperties": true
99
- }
99
+ }
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  from typing import NotRequired, TypedDict
5
5
 
6
- from intentkit.abstracts.skill import SkillStoreABC
7
6
  from intentkit.skills.allora.base import AlloraBaseTool
8
7
  from intentkit.skills.allora.price import AlloraGetPrice
9
8
  from intentkit.skills.base import SkillConfig, SkillState
@@ -28,7 +27,6 @@ class Config(SkillConfig):
28
27
  async def get_skills(
29
28
  config: "Config",
30
29
  is_private: bool,
31
- store: SkillStoreABC,
32
30
  **_,
33
31
  ) -> list[AlloraBaseTool]:
34
32
  """Get all Allora skills.
@@ -36,7 +34,6 @@ async def get_skills(
36
34
  Args:
37
35
  config: The configuration for Allora skills.
38
36
  is_private: Whether to include private skills.
39
- store: The skill store for persisting data.
40
37
 
41
38
  Returns:
42
39
  A list of Allora skills.
@@ -53,7 +50,7 @@ async def get_skills(
53
50
  # Get each skill using the cached getter
54
51
  result = []
55
52
  for name in available_skills:
56
- skill = get_allora_skill(name, store)
53
+ skill = get_allora_skill(name)
57
54
  if skill:
58
55
  result.append(skill)
59
56
  return result
@@ -61,22 +58,18 @@ async def get_skills(
61
58
 
62
59
  def get_allora_skill(
63
60
  name: str,
64
- store: SkillStoreABC,
65
61
  ) -> AlloraBaseTool:
66
62
  """Get an Allora skill by name.
67
63
 
68
64
  Args:
69
65
  name: The name of the skill to get
70
- store: The skill store for persisting data
71
66
 
72
67
  Returns:
73
68
  The requested Allora skill
74
69
  """
75
70
  if name == "get_price_prediction":
76
71
  if name not in _cache:
77
- _cache[name] = AlloraGetPrice(
78
- skill_store=store,
79
- )
72
+ _cache[name] = AlloraGetPrice()
80
73
  return _cache[name]
81
74
  else:
82
75
  logger.warning(f"Unknown Allora skill: {name}")
@@ -1,9 +1,7 @@
1
- from typing import Type
2
-
3
- from langchain.tools.base import ToolException
1
+ from langchain_core.tools.base import ToolException
4
2
  from pydantic import BaseModel, Field
5
3
 
6
- from intentkit.abstracts.skill import SkillStoreABC
4
+ from intentkit.config.config import config
7
5
  from intentkit.skills.base import IntentKitSkill
8
6
 
9
7
  base_url = "https://api.upshot.xyz/v2/allora"
@@ -14,17 +12,14 @@ class AlloraBaseTool(IntentKitSkill):
14
12
 
15
13
  name: str = Field(description="The name of the tool")
16
14
  description: str = Field(description="A description of what the tool does")
17
- args_schema: Type[BaseModel]
18
- skill_store: SkillStoreABC = Field(
19
- description="The skill store for persisting data"
20
- )
15
+ args_schema: type[BaseModel]
21
16
 
22
17
  def get_api_key(self) -> str:
23
18
  context = self.get_context()
24
19
  skill_config = context.agent.skill_config(self.category)
25
20
  api_key_provider = skill_config.get("api_key_provider")
26
21
  if api_key_provider == "platform":
27
- return self.skill_store.get_system_config("allora_api_key")
22
+ return config.allora_api_key
28
23
  # for backward compatibility, may only have api_key in skill_config
29
24
  elif skill_config.get("api_key"):
30
25
  return skill_config.get("api_key")
@@ -1,7 +1,7 @@
1
- from typing import Literal, Type
1
+ from typing import Literal
2
2
 
3
3
  import httpx
4
- from langchain.tools.base import ToolException
4
+ from langchain_core.tools.base import ToolException
5
5
  from pydantic import BaseModel, Field
6
6
 
7
7
  from intentkit.skills.allora.base import AlloraBaseTool
@@ -57,7 +57,6 @@ class AlloraGetPrice(AlloraBaseTool):
57
57
  The Allora Price Prediction Feed tool fetches the price prediction feed from the Allora API.
58
58
  Ethereum (ETH) or Bitcoin (BTC) price predictions (5-minute, 8-hour)
59
59
 
60
-
61
60
  Attributes:
62
61
  name (str): Name of the tool, specifically "get_price_prediction".
63
62
  description (str): Comprehensive description of the tool's purpose and functionality.
@@ -69,7 +68,7 @@ class AlloraGetPrice(AlloraBaseTool):
69
68
  The Allora Price Prediction Feed tool fetches the price prediction feed from the Allora API.
70
69
  Ethereum (ETH) or Bitcoin (BTC) price predictions (5-minute, 8-hour)
71
70
  """
72
- args_schema: Type[BaseModel] = AlloraGetPriceInput
71
+ args_schema: type[BaseModel] = AlloraGetPriceInput
73
72
 
74
73
  def _run(self, question: str) -> AlloraGetPriceOutput:
75
74
  """Run the tool to get the token price prediction from Allora API.
@@ -5,14 +5,15 @@
5
5
  "description": "Integration with Allora API for blockchain-based price predictions and market forecasting services via Upshot's prediction markets",
6
6
  "x-icon": "https://ai.service.crestal.dev/skills/allora/allora.jpeg",
7
7
  "x-tags": [
8
- "Blockchain"
8
+ "Analytics",
9
+ "Crypto"
9
10
  ],
10
11
  "properties": {
11
12
  "enabled": {
12
13
  "type": "boolean",
13
14
  "title": "Enabled",
14
15
  "description": "Whether this skill is enabled",
15
- "default": true
16
+ "default": false
16
17
  },
17
18
  "states": {
18
19
  "type": "object",