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,164 @@
1
+ import logging
2
+ from decimal import Decimal, InvalidOperation
3
+ from typing import Any, Dict, Literal, Type
4
+
5
+ from langchain_core.runnables import RunnableConfig
6
+ from pydantic import BaseModel, Field
7
+
8
+ from intentkit.skills.carv.base import CarvBaseTool
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class CarvInput(BaseModel):
14
+ """
15
+ Input schema for CARV SQL Query API.
16
+ Defines parameters controllable by the user when invoking the tool.
17
+ """
18
+
19
+ question: str = Field(
20
+ ...,
21
+ description="The question to query on-chain data.",
22
+ )
23
+ chain: Literal["ethereum", "base", "bitcoin", "solana"] = Field(
24
+ ...,
25
+ description="supported chain is ethereum, base, bitcoin, solana",
26
+ )
27
+
28
+
29
+ class OnchainQueryTool(CarvBaseTool):
30
+ """
31
+ Tool for querying on-chain data using natural language via the CARV SQL Query API.
32
+
33
+ This tool allows you to ask questions about blockchain data in plain English, and it will return
34
+ the relevant information. Behind the scenes, it uses the CARV API to convert your question into a SQL query
35
+ and retrieve the results.
36
+
37
+ Supported Blockchains: Ethereum, Base, Bitcoin, and Solana.
38
+
39
+ If the question is about a blockchain other than the ones listed above, or is not a clear question, the
40
+ tool will return an error.
41
+ """
42
+
43
+ name: str = "carv_onchain_query"
44
+ description: str = (
45
+ "Query blockchain data from Ethereum, Base, Bitcoin, or Solana using natural language. "
46
+ "This tool provides access to detailed metrics including block information (timestamps, hashes, miners, gas used/limits), "
47
+ "transaction details (hashes, sender/receiver addresses, amounts, gas prices), and overall network utilization. "
48
+ "It supports aggregate analytics such as daily transaction counts, average gas prices, top wallet activity, and blockchain growth trends. "
49
+ "You can filter results by time range, address type, transaction value, and other parameters.\n\n"
50
+ "IMPORTANT Rules:\n"
51
+ "- Only Ethereum, Base, Bitcoin, and Solana are supported.\n"
52
+ "- Always infer the target blockchain from the user's query.\n"
53
+ "- If an unsupported blockchain is requested, clearly explain the limitation.\n"
54
+ "- Convert user input into a specific and actionable natural language query (e.g., "
55
+ '"What\'s the most active address on Ethereum over the past 24 hours?" or '
56
+ '"Show the largest ETH transaction in the last 30 days").\n'
57
+ "- Respond in clear, concise natural language using only the data returned by the tool.\n"
58
+ "- Avoid markdown or bullet points unless explicitly requested.\n"
59
+ "- ETH values are denominated in 18 decimals—consider 10^18 when interpreting amounts.\n"
60
+ "- Never fabricate or infer data beyond what the tool provides."
61
+ )
62
+ args_schema: Type[BaseModel] = CarvInput
63
+
64
+ async def _arun(
65
+ self,
66
+ question: str,
67
+ chain: str,
68
+ config: RunnableConfig = None, # type: ignore
69
+ **kwargs: Any,
70
+ ) -> Dict[str, Any]:
71
+ """
72
+ Queries the CARV SQL Query API and returns the response.
73
+ """
74
+ context = self.context_from_config(config)
75
+ try:
76
+ await self.apply_rate_limit(context)
77
+
78
+ payload = {"question": question}
79
+
80
+ result, error = await self._call_carv_api(
81
+ context=context,
82
+ endpoint="/ai-agent-backend/sql_query_by_llm",
83
+ method="POST",
84
+ payload=payload,
85
+ )
86
+
87
+ if error is not None or result is None:
88
+ logger.error(f"Error returned from CARV API: {error}")
89
+ return {
90
+ "error": True,
91
+ "error_type": "APIError",
92
+ "message": "Failed to fetch data from CARV API.",
93
+ "details": error,
94
+ }
95
+
96
+ _normalize_unit(result, chain)
97
+ return {"success": True, **result}
98
+
99
+ except Exception as e:
100
+ logger.error(f"An unexpected error occurred: {e}", exc_info=True)
101
+ return {
102
+ "error": True,
103
+ "error_type": type(e).__name__,
104
+ "message": "An unexpected error occurred.",
105
+ "details": str(e),
106
+ }
107
+
108
+
109
+ def _normalize_unit(response_data: Dict[str, Any], chain: str) -> None:
110
+ """
111
+ Normalizes the 'value' field in on-chain response data to a human-readable format.
112
+ Adds the corresponding token ticker after the value.
113
+
114
+ Supported chains:
115
+ - Ethereum: 10^18 -> ETH
116
+ - Base: 10^18 -> ETH
117
+ - Solana: 10^9 -> SOL
118
+ - Bitcoin: 10^8 -> BTC
119
+ """
120
+ column_infos = response_data.get("column_infos", [])
121
+ rows = response_data.get("rows", [])
122
+
123
+ if "value" not in column_infos:
124
+ return
125
+
126
+ value_index = column_infos.index("value")
127
+
128
+ chain = chain.lower()
129
+ if chain == "ethereum":
130
+ divisor = Decimal("1e18")
131
+ ticker = "ETH"
132
+ elif chain == "base":
133
+ divisor = Decimal("1e18")
134
+ ticker = "ETH"
135
+ elif chain == "solana":
136
+ divisor = Decimal("1e9")
137
+ ticker = "SOL"
138
+ elif chain == "bitcoin":
139
+ divisor = Decimal("1e8")
140
+ ticker = "BTC"
141
+ else:
142
+ logger.warning(f"Unsupported chain '{chain}' for unit normalization.")
143
+ return
144
+
145
+ for row in rows:
146
+ items = row.get("items", [])
147
+ if len(items) > value_index:
148
+ original_value = items[value_index]
149
+ try:
150
+ normalized = str(original_value).strip()
151
+ try:
152
+ value_decimal = Decimal(normalized)
153
+ except InvalidOperation:
154
+ value_decimal = Decimal.from_float(float(normalized))
155
+
156
+ converted = value_decimal / divisor
157
+ formatted_value = (
158
+ format(converted, "f").rstrip("0").rstrip(".")
159
+ if "." in format(converted, "f")
160
+ else format(converted, "f")
161
+ )
162
+ items[value_index] = f"{formatted_value} {ticker}"
163
+ except Exception as e:
164
+ logger.warning(f"Unable to normalize value '{original_value}': {e}")
@@ -0,0 +1,137 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "CARV",
4
+ "description": "Configuration for the CARV skill.",
5
+ "type": "object",
6
+ "x-icon": "https://ai.service.crestal.dev/skills/carv/carv.webp",
7
+ "x-tags": [
8
+ "AI",
9
+ "Data",
10
+ "Information",
11
+ "Analytics",
12
+ "Market Data"
13
+ ],
14
+ "properties": {
15
+ "enabled": {
16
+ "type": "boolean",
17
+ "description": "Enable or disable the CARV skill.",
18
+ "default": false
19
+ },
20
+ "states": {
21
+ "type": "object",
22
+ "title": "Skill States",
23
+ "description": "Enable/disable specific tools for CARV",
24
+ "properties": {
25
+ "onchain_query": {
26
+ "type": "string",
27
+ "title": "On-Chain Query",
28
+ "enum": [
29
+ "disabled",
30
+ "public",
31
+ "private"
32
+ ],
33
+ "x-enum-title": [
34
+ "Disabled",
35
+ "Agent Owner + All Users",
36
+ "Agent Owner Only"
37
+ ],
38
+ "description": "allows you to use the nature language to query the on-chain data. Behind the scean, CARV will use LLM model to interpreate the nature language input and convert into the sql query based on the above schemas",
39
+ "default": "public"
40
+ },
41
+ "token_info_and_price": {
42
+ "type": "string",
43
+ "title": "Token Information and Price",
44
+ "enum": [
45
+ "disabled",
46
+ "public",
47
+ "private"
48
+ ],
49
+ "x-enum-title": [
50
+ "Disabled",
51
+ "Agent Owner + All Users",
52
+ "Agent Owner Only"
53
+ ],
54
+ "description": "Fetches detailed information and current USD price of a cryptocurrency token from CARV API using its ticker symbol (e.g., 'eth', 'btc'), returning metadata like name, symbol, platform, categories, and contract addresses, useful for understanding its identity, ecosystem, market value, and for obtaining comprehensive token data with live pricing.",
55
+ "default": "public"
56
+ },
57
+ "fetch_news": {
58
+ "type": "string",
59
+ "title": "Fetch News",
60
+ "enum": [
61
+ "disabled",
62
+ "public",
63
+ "private"
64
+ ],
65
+ "x-enum-title": [
66
+ "Disabled",
67
+ "Agent Owner + All Users",
68
+ "Agent Owner Only"
69
+ ],
70
+ "description": "retrieves a list of recent news items, each including a title, URL, and a short description",
71
+ "default": "disabled"
72
+ }
73
+ }
74
+ },
75
+ "api_key_provider": {
76
+ "type": "string",
77
+ "title": "API Key Provider",
78
+ "description": "Provider of the API key",
79
+ "enum": [
80
+ "agent_owner",
81
+ "platform"
82
+ ],
83
+ "x-enum-title": [
84
+ "Owner Provided",
85
+ "Nation Hosted"
86
+ ],
87
+ "default": "platform"
88
+ }
89
+ },
90
+ "required": [
91
+ "enabled",
92
+ "states"
93
+ ],
94
+ "if": {
95
+ "allOf": [
96
+ {
97
+ "properties": {
98
+ "enabled": {
99
+ "const": true
100
+ }
101
+ }
102
+ },
103
+ {
104
+ "properties": {
105
+ "api_key_provider": {
106
+ "const": "agent_owner"
107
+ }
108
+ }
109
+ }
110
+ ]
111
+ },
112
+ "then": {
113
+ "properties": {
114
+ "api_key": {
115
+ "type": "string",
116
+ "title": "CARV API Key",
117
+ "x-link": "[Get your API key](https://docs.carv.io/d.a.t.a.-ai-framework/api-documentation#authentication)",
118
+ "x-sensitive": true,
119
+ "description": "API Key for authenticating with the CARV API."
120
+ },
121
+ "rate_limit_number": {
122
+ "type": "integer",
123
+ "title": "Rate Limit Number",
124
+ "description": "Number of requests allowed per time window."
125
+ },
126
+ "rate_limit_minutes": {
127
+ "type": "integer",
128
+ "title": "Rate Limit Minutes",
129
+ "description": "Time window in minutes for rate limiting."
130
+ }
131
+ },
132
+ "required": [
133
+ "api_key"
134
+ ]
135
+ },
136
+ "additionalProperties": true
137
+ }
@@ -0,0 +1,110 @@
1
+ import logging
2
+ import re
3
+ from typing import Any, Dict, Optional, Type
4
+
5
+ from langchain_core.runnables import RunnableConfig
6
+ from pydantic import BaseModel, Field
7
+
8
+ from intentkit.skills.carv.base import CarvBaseTool
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class TokenInfoAndPriceInput(BaseModel):
14
+ ticker: str = Field(
15
+ description="The token's ticker symbol (e.g., 'eth', 'btc', 'sol', 'xrp')."
16
+ )
17
+ token_name: str = Field(
18
+ description="The token name (e.g ethereum, bitcoin, solana, ripple)"
19
+ )
20
+ amount: Optional[float] = Field(
21
+ description="(optional) amount of token, fill this if user asking for how much x amount of specific token worth"
22
+ )
23
+
24
+
25
+ class TokenInfoAndPriceTool(CarvBaseTool):
26
+ """
27
+ Fetches detailed information and the current USD price of a cryptocurrency token from the CARV API,
28
+ given its ticker symbol (e.g., 'eth', 'btc', 'aave').
29
+ Returns metadata including the token's name, symbol, platform, category tags, and contract addresses
30
+ Useful for understanding a token's identity, ecosystem, and market valu
31
+ Use this tool when you need comprehensive token data and live pricing from CARV
32
+ """
33
+
34
+ name: str = "carv_token_info_and_price"
35
+ description: str = (
36
+ "Fetches detailed information and the current USD price of a cryptocurrency token from the CARV API, "
37
+ "given its ticker symbol (e.g., 'eth', 'btc', 'aave'). or token name"
38
+ "Returns metadata including the token's name, symbol, platform, category tags, and contract addresses "
39
+ "Useful for understanding a token's identity, ecosystem, and market value"
40
+ "Use this tool when you need comprehensive token data and live pricing from CARV."
41
+ )
42
+ args_schema: Type[BaseModel] = TokenInfoAndPriceInput
43
+
44
+ async def _arun(
45
+ self,
46
+ ticker: str,
47
+ token_name: str,
48
+ amount: Optional[float] = 1,
49
+ config: RunnableConfig = None, # type: ignore
50
+ **kwargs: Any,
51
+ ) -> Dict[str, Any]:
52
+ if not ticker:
53
+ return {
54
+ "error": True,
55
+ "message": "ticker is null",
56
+ "suggestion": "ask the user for the specific ticker, and fill the `ticker` field when calling this tool",
57
+ }
58
+
59
+ context = self.context_from_config(config)
60
+ params = {"ticker": ticker}
61
+ path = "/ai-agent-backend/token_info"
62
+ method = "GET"
63
+
64
+ result, error = await self._call_carv_api(
65
+ context=context,
66
+ endpoint=path,
67
+ params=params,
68
+ method=method,
69
+ )
70
+
71
+ if error is not None or result is None:
72
+ logger.error(f"Error returned from CARV API: {error}")
73
+ return {
74
+ "error": True,
75
+ "error_type": "APIError",
76
+ "message": "Failed to fetch token info from CARV API.",
77
+ "details": error,
78
+ }
79
+
80
+ # retry with token_name if price is 0 or missing
81
+ if "price" not in result or result["price"] == 0:
82
+ fallback_ticker = re.sub(r"\s+", "-", token_name.strip().lower())
83
+ logger.info(
84
+ f"Fallback triggered. Trying with fallback ticker: {fallback_ticker}"
85
+ )
86
+
87
+ fallback_params = {"ticker": fallback_ticker}
88
+ result, error = await self._call_carv_api(
89
+ context=context,
90
+ endpoint=path,
91
+ params=fallback_params,
92
+ method=method,
93
+ )
94
+
95
+ if error is not None or result is None or result.get("price") == 0:
96
+ logger.error(f"Fallback error returned from CARV API: {error}")
97
+ return {
98
+ "error": True,
99
+ "error_type": "APIError",
100
+ "message": "Failed to fetch token info from CARV API with fallback.",
101
+ "details": error,
102
+ }
103
+
104
+ if "price" in result and amount is not None:
105
+ return {
106
+ "additional_info": f"{amount} {ticker.upper()} is worth ${round(amount * result['price'], 2)}",
107
+ **result,
108
+ }
109
+
110
+ return result
@@ -0,0 +1,137 @@
1
+ """CDP wallet interaction skills."""
2
+
3
+ from typing import TypedDict
4
+
5
+ from coinbase_agentkit import (
6
+ AgentKit,
7
+ AgentKitConfig,
8
+ CdpWalletProvider,
9
+ basename_action_provider,
10
+ cdp_api_action_provider,
11
+ cdp_wallet_action_provider,
12
+ erc20_action_provider,
13
+ morpho_action_provider,
14
+ pyth_action_provider,
15
+ superfluid_action_provider,
16
+ wallet_action_provider,
17
+ weth_action_provider,
18
+ wow_action_provider,
19
+ )
20
+ from coinbase_agentkit.action_providers.erc721 import erc721_action_provider
21
+ from coinbase_agentkit_langchain import get_langchain_tools
22
+
23
+ from intentkit.abstracts.skill import SkillStoreABC
24
+ from intentkit.clients import CdpClient, get_cdp_client
25
+ from intentkit.skills.base import SkillConfig, SkillState
26
+ from intentkit.skills.cdp.base import CDPBaseTool
27
+ from intentkit.skills.cdp.get_balance import GetBalance
28
+
29
+ # Cache skills at the system level, because they are stateless
30
+ _cache: dict[str, CDPBaseTool] = {}
31
+
32
+
33
+ class SkillStates(TypedDict):
34
+ get_balance: SkillState
35
+ WalletActionProvider_get_balance: SkillState
36
+ WalletActionProvider_get_wallet_details: SkillState
37
+ WalletActionProvider_native_transfer: SkillState
38
+ CdpApiActionProvider_address_reputation: SkillState
39
+ CdpApiActionProvider_request_faucet_funds: SkillState
40
+ CdpWalletActionProvider_deploy_contract: SkillState
41
+ CdpWalletActionProvider_deploy_nft: SkillState
42
+ CdpWalletActionProvider_deploy_token: SkillState
43
+ CdpWalletActionProvider_trade: SkillState
44
+ PythActionProvider_fetch_price: SkillState
45
+ PythActionProvider_fetch_price_feed_id: SkillState
46
+ BasenameActionProvider_register_basename: SkillState
47
+ ERC20ActionProvider_get_balance: SkillState
48
+ ERC20ActionProvider_transfer: SkillState
49
+ Erc721ActionProvider_get_balance: SkillState
50
+ Erc721ActionProvider_mint: SkillState
51
+ Erc721ActionProvider_transfer: SkillState
52
+ WethActionProvider_wrap_eth: SkillState
53
+ MorphoActionProvider_deposit: SkillState
54
+ MorphoActionProvider_withdraw: SkillState
55
+ SuperfluidActionProvider_create_flow: SkillState
56
+ SuperfluidActionProvider_delete_flow: SkillState
57
+ SuperfluidActionProvider_update_flow: SkillState
58
+ WowActionProvider_buy_token: SkillState
59
+ WowActionProvider_create_token: SkillState
60
+ WowActionProvider_sell_token: SkillState
61
+
62
+
63
+ class Config(SkillConfig):
64
+ """Configuration for CDP skills."""
65
+
66
+ states: SkillStates
67
+
68
+
69
+ # CDP skills is not stateless for agents, so we need agent_id here
70
+ # If you are skill contributor, please do not follow this pattern
71
+ async def get_skills(
72
+ config: "Config",
73
+ is_private: bool,
74
+ store: SkillStoreABC,
75
+ agent_id: str,
76
+ **_,
77
+ ) -> list[CDPBaseTool]:
78
+ """Get all CDP skills.
79
+
80
+ Args:
81
+ config: The configuration for CDP skills.
82
+ is_private: Whether to include private skills.
83
+ store: The skill store for persisting data.
84
+ agent_id: The ID of the agent using the skills.
85
+
86
+ Returns:
87
+ A list of CDP skills.
88
+ """
89
+ available_skills = []
90
+
91
+ # Include skills based on their state
92
+ for skill_name, state in config["states"].items():
93
+ if state == "disabled":
94
+ continue
95
+ elif state == "public" or (state == "private" and is_private):
96
+ available_skills.append(skill_name)
97
+
98
+ # Initialize CDP client
99
+ cdp_client: CdpClient = await get_cdp_client(agent_id, store)
100
+ cdp_wallet_provider: CdpWalletProvider = await cdp_client.get_wallet_provider()
101
+ cdp_provider_config = await cdp_client.get_provider_config()
102
+ agent_kit = AgentKit(
103
+ AgentKitConfig(
104
+ wallet_provider=cdp_wallet_provider,
105
+ action_providers=[
106
+ wallet_action_provider(),
107
+ cdp_api_action_provider(cdp_provider_config),
108
+ cdp_wallet_action_provider(cdp_provider_config),
109
+ pyth_action_provider(),
110
+ basename_action_provider(),
111
+ erc20_action_provider(),
112
+ erc721_action_provider(),
113
+ weth_action_provider(),
114
+ morpho_action_provider(),
115
+ superfluid_action_provider(),
116
+ wow_action_provider(),
117
+ ],
118
+ )
119
+ )
120
+ cdp_tools = get_langchain_tools(agent_kit)
121
+ tools = []
122
+ for skill in available_skills:
123
+ if skill == "get_balance":
124
+ tools.append(
125
+ GetBalance(
126
+ wallet=cdp_wallet_provider._wallet,
127
+ agent_id=agent_id,
128
+ skill_store=store,
129
+ )
130
+ )
131
+ continue
132
+ for tool in cdp_tools:
133
+ if tool.name.endswith(skill):
134
+ tool.handle_tool_error = lambda e: f"tool error: {e}"
135
+ tool.handle_validation_error = lambda e: f"validation error: {e}"
136
+ tools.append(tool)
137
+ return tools
@@ -0,0 +1,21 @@
1
+ from typing import Type
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from intentkit.abstracts.skill import SkillStoreABC
6
+ from intentkit.skills.base import IntentKitSkill
7
+
8
+
9
+ class CDPBaseTool(IntentKitSkill):
10
+ """Base class for CDP tools."""
11
+
12
+ name: str = Field(description="The name of the tool")
13
+ 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
+ )
18
+
19
+ @property
20
+ def category(self) -> str:
21
+ return "cdp"
Binary file
@@ -0,0 +1,81 @@
1
+ from typing import Type
2
+
3
+ from cdp import Wallet
4
+ from pydantic import BaseModel, Field
5
+
6
+ from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.skills.cdp.base import CDPBaseTool
8
+
9
+
10
+ class GetBalanceInput(BaseModel):
11
+ """Input for GetBalance tool."""
12
+
13
+ asset_id: str = Field(
14
+ description="The asset ID to get the balance for (e.g., 'eth', 'usdc', or a valid contract address)"
15
+ )
16
+
17
+
18
+ class GetBalance(CDPBaseTool):
19
+ """Tool for getting balance from CDP wallet.
20
+
21
+ This tool uses the CDP API to get balance for all addresses in a wallet for a given asset.
22
+
23
+ Attributes:
24
+ name: The name of the tool.
25
+ description: A description of what the tool does.
26
+ args_schema: The schema for the tool's input arguments.
27
+ """
28
+
29
+ agent_id: str
30
+ skill_store: SkillStoreABC
31
+ wallet: Wallet | None = None
32
+
33
+ name: str = "cdp_get_balance"
34
+ description: str = (
35
+ "This tool will get the balance of all the addresses in the wallet for a given asset. It takes the asset ID as input."
36
+ "Always use 'eth' for the native asset ETH and 'usdc' for USDC. "
37
+ "Other valid asset IDs are: weth,dai,reth,brett,w,cbeth,axl,iotx,prime,aero,rsr,mog,tbtc,npc,yfi"
38
+ )
39
+ args_schema: Type[BaseModel] = GetBalanceInput
40
+
41
+ async def _arun(self, asset_id: str) -> str:
42
+ """Async implementation of the tool to get balance.
43
+
44
+ Args:
45
+ asset_id (str): The asset ID to get the balance for.
46
+
47
+ Returns:
48
+ str: A message containing the balance information or error message.
49
+ """
50
+ try:
51
+ if not self.wallet:
52
+ return "Failed to get wallet."
53
+
54
+ # for each address in the wallet, get the balance for the asset
55
+ balances = {}
56
+
57
+ try:
58
+ for address in self.wallet.addresses:
59
+ balance = address.balance(asset_id)
60
+ balances[address.address_id] = balance
61
+ except Exception as e:
62
+ return f"Error getting balance for all addresses in the wallet: {e!s}"
63
+
64
+ # Format each balance entry on a new line
65
+ balance_lines = [
66
+ f" {addr}: {balance}" for addr, balance in balances.items()
67
+ ]
68
+ formatted_balances = "\n".join(balance_lines)
69
+ return f"Balances for wallet {self.wallet.id}:\n{formatted_balances}"
70
+
71
+ except Exception as e:
72
+ return f"Error getting balance: {str(e)}"
73
+
74
+ def _run(self, asset_id: str) -> str:
75
+ """Sync implementation of the tool.
76
+
77
+ This method is deprecated since we now have native async implementation in _arun.
78
+ """
79
+ raise NotImplementedError(
80
+ "Use _arun instead, which is the async implementation"
81
+ )