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,323 @@
1
+ """DeFi Llama skills."""
2
+
3
+ import logging
4
+ from typing import TypedDict
5
+
6
+ from intentkit.abstracts.skill import SkillStoreABC
7
+ from intentkit.skills.base import SkillConfig, SkillState
8
+ from intentkit.skills.defillama.base import DefiLlamaBaseTool
9
+ from intentkit.skills.defillama.coins.fetch_batch_historical_prices import (
10
+ DefiLlamaFetchBatchHistoricalPrices,
11
+ )
12
+ from intentkit.skills.defillama.coins.fetch_block import DefiLlamaFetchBlock
13
+
14
+ # Coins Tools
15
+ from intentkit.skills.defillama.coins.fetch_current_prices import (
16
+ DefiLlamaFetchCurrentPrices,
17
+ )
18
+ from intentkit.skills.defillama.coins.fetch_first_price import DefiLlamaFetchFirstPrice
19
+ from intentkit.skills.defillama.coins.fetch_historical_prices import (
20
+ DefiLlamaFetchHistoricalPrices,
21
+ )
22
+ from intentkit.skills.defillama.coins.fetch_price_chart import DefiLlamaFetchPriceChart
23
+ from intentkit.skills.defillama.coins.fetch_price_percentage import (
24
+ DefiLlamaFetchPricePercentage,
25
+ )
26
+
27
+ # Fees Tools
28
+ from intentkit.skills.defillama.fees.fetch_fees_overview import (
29
+ DefiLlamaFetchFeesOverview,
30
+ )
31
+ from intentkit.skills.defillama.stablecoins.fetch_stablecoin_chains import (
32
+ DefiLlamaFetchStablecoinChains,
33
+ )
34
+ from intentkit.skills.defillama.stablecoins.fetch_stablecoin_charts import (
35
+ DefiLlamaFetchStablecoinCharts,
36
+ )
37
+ from intentkit.skills.defillama.stablecoins.fetch_stablecoin_prices import (
38
+ DefiLlamaFetchStablecoinPrices,
39
+ )
40
+
41
+ # Stablecoins Tools
42
+ from intentkit.skills.defillama.stablecoins.fetch_stablecoins import (
43
+ DefiLlamaFetchStablecoins,
44
+ )
45
+ from intentkit.skills.defillama.tvl.fetch_chain_historical_tvl import (
46
+ DefiLlamaFetchChainHistoricalTvl,
47
+ )
48
+ from intentkit.skills.defillama.tvl.fetch_chains import DefiLlamaFetchChains
49
+ from intentkit.skills.defillama.tvl.fetch_historical_tvl import (
50
+ DefiLlamaFetchHistoricalTvl,
51
+ )
52
+ from intentkit.skills.defillama.tvl.fetch_protocol import DefiLlamaFetchProtocol
53
+ from intentkit.skills.defillama.tvl.fetch_protocol_current_tvl import (
54
+ DefiLlamaFetchProtocolCurrentTvl,
55
+ )
56
+
57
+ # TVL Tools
58
+ from intentkit.skills.defillama.tvl.fetch_protocols import DefiLlamaFetchProtocols
59
+
60
+ # Volumes Tools
61
+ from intentkit.skills.defillama.volumes.fetch_dex_overview import (
62
+ DefiLlamaFetchDexOverview,
63
+ )
64
+ from intentkit.skills.defillama.volumes.fetch_dex_summary import (
65
+ DefiLlamaFetchDexSummary,
66
+ )
67
+ from intentkit.skills.defillama.volumes.fetch_options_overview import (
68
+ DefiLlamaFetchOptionsOverview,
69
+ )
70
+ from intentkit.skills.defillama.yields.fetch_pool_chart import DefiLlamaFetchPoolChart
71
+
72
+ # Yields Tools
73
+ from intentkit.skills.defillama.yields.fetch_pools import DefiLlamaFetchPools
74
+
75
+ # we cache skills in system level, because they are stateless
76
+ _cache: dict[str, DefiLlamaBaseTool] = {}
77
+
78
+ logger = logging.getLogger(__name__)
79
+
80
+
81
+ class SkillStates(TypedDict):
82
+ # TVL Skills
83
+ fetch_protocols: SkillState
84
+ fetch_protocol: SkillState
85
+ fetch_historical_tvl: SkillState
86
+ fetch_chain_historical_tvl: SkillState
87
+ fetch_protocol_current_tvl: SkillState
88
+ fetch_chains: SkillState
89
+
90
+ # Coins Skills
91
+ fetch_current_prices: SkillState
92
+ fetch_historical_prices: SkillState
93
+ fetch_batch_historical_prices: SkillState
94
+ fetch_price_chart: SkillState
95
+ fetch_price_percentage: SkillState
96
+ fetch_first_price: SkillState
97
+ fetch_block: SkillState
98
+
99
+ # Stablecoins Skills
100
+ fetch_stablecoins: SkillState
101
+ fetch_stablecoin_charts: SkillState
102
+ fetch_stablecoin_chains: SkillState
103
+ fetch_stablecoin_prices: SkillState
104
+
105
+ # Yields Skills
106
+ fetch_pools: SkillState
107
+ fetch_pool_chart: SkillState
108
+
109
+ # Volumes Skills
110
+ fetch_dex_overview: SkillState
111
+ fetch_dex_summary: SkillState
112
+ fetch_options_overview: SkillState
113
+
114
+ # Fees Skills
115
+ fetch_fees_overview: SkillState
116
+
117
+
118
+ class Config(SkillConfig):
119
+ """Configuration for DeFi Llama skills."""
120
+
121
+ states: SkillStates
122
+
123
+
124
+ async def get_skills(
125
+ config: "Config",
126
+ is_private: bool,
127
+ store: SkillStoreABC,
128
+ **_,
129
+ ) -> list[DefiLlamaBaseTool]:
130
+ """Get all DeFi Llama skills."""
131
+ available_skills = []
132
+
133
+ # Include skills based on their state
134
+ for skill_name, state in config["states"].items():
135
+ if state == "disabled":
136
+ continue
137
+ elif state == "public" or (state == "private" and is_private):
138
+ available_skills.append(skill_name)
139
+
140
+ # Get each skill using the cached getter
141
+ result = []
142
+ for name in available_skills:
143
+ skill = get_defillama_skill(name, store)
144
+ if skill:
145
+ result.append(skill)
146
+ return result
147
+
148
+
149
+ def get_defillama_skill(
150
+ name: str,
151
+ store: SkillStoreABC,
152
+ ) -> DefiLlamaBaseTool:
153
+ """Get a DeFi Llama skill by name.
154
+
155
+ Args:
156
+ name: The name of the skill to get
157
+ store: The skill store for persisting data
158
+
159
+ Returns:
160
+ The requested DeFi Llama skill
161
+
162
+ Notes:
163
+ Each skill maps to a specific DeFi Llama API endpoint. Some skills handle both
164
+ base and chain-specific endpoints through optional parameters rather than
165
+ separate implementations.
166
+ """
167
+ # TVL Skills
168
+ if name == "fetch_protocols":
169
+ if name not in _cache:
170
+ _cache[name] = DefiLlamaFetchProtocols(
171
+ skill_store=store,
172
+ )
173
+ return _cache[name]
174
+ elif name == "fetch_protocol":
175
+ if name not in _cache:
176
+ _cache[name] = DefiLlamaFetchProtocol(
177
+ skill_store=store,
178
+ )
179
+ return _cache[name]
180
+ elif name == "fetch_historical_tvl":
181
+ if name not in _cache:
182
+ _cache[name] = DefiLlamaFetchHistoricalTvl(
183
+ skill_store=store,
184
+ )
185
+ return _cache[name]
186
+ elif name == "fetch_chain_historical_tvl":
187
+ if name not in _cache:
188
+ _cache[name] = DefiLlamaFetchChainHistoricalTvl(
189
+ skill_store=store,
190
+ )
191
+ return _cache[name]
192
+ elif name == "fetch_protocol_current_tvl":
193
+ if name not in _cache:
194
+ _cache[name] = DefiLlamaFetchProtocolCurrentTvl(
195
+ skill_store=store,
196
+ )
197
+ return _cache[name]
198
+ elif name == "fetch_chains":
199
+ if name not in _cache:
200
+ _cache[name] = DefiLlamaFetchChains(
201
+ skill_store=store,
202
+ )
203
+ return _cache[name]
204
+
205
+ # Coins Skills
206
+ elif name == "fetch_current_prices":
207
+ if name not in _cache:
208
+ _cache[name] = DefiLlamaFetchCurrentPrices(
209
+ skill_store=store,
210
+ )
211
+ return _cache[name]
212
+ elif name == "fetch_historical_prices":
213
+ if name not in _cache:
214
+ _cache[name] = DefiLlamaFetchHistoricalPrices(
215
+ skill_store=store,
216
+ )
217
+ return _cache[name]
218
+ elif name == "fetch_batch_historical_prices":
219
+ if name not in _cache:
220
+ _cache[name] = DefiLlamaFetchBatchHistoricalPrices(
221
+ skill_store=store,
222
+ )
223
+ return _cache[name]
224
+ elif name == "fetch_price_chart":
225
+ if name not in _cache:
226
+ _cache[name] = DefiLlamaFetchPriceChart(
227
+ skill_store=store,
228
+ )
229
+ return _cache[name]
230
+ elif name == "fetch_price_percentage":
231
+ if name not in _cache:
232
+ _cache[name] = DefiLlamaFetchPricePercentage(
233
+ skill_store=store,
234
+ )
235
+ return _cache[name]
236
+ elif name == "fetch_first_price":
237
+ if name not in _cache:
238
+ _cache[name] = DefiLlamaFetchFirstPrice(
239
+ skill_store=store,
240
+ )
241
+ return _cache[name]
242
+ elif name == "fetch_block":
243
+ if name not in _cache:
244
+ _cache[name] = DefiLlamaFetchBlock(
245
+ skill_store=store,
246
+ )
247
+ return _cache[name]
248
+
249
+ # Stablecoins Skills
250
+ elif name == "fetch_stablecoins":
251
+ if name not in _cache:
252
+ _cache[name] = DefiLlamaFetchStablecoins(
253
+ skill_store=store,
254
+ )
255
+ return _cache[name]
256
+ elif name == "fetch_stablecoin_charts":
257
+ if name not in _cache:
258
+ _cache[name] = DefiLlamaFetchStablecoinCharts(
259
+ skill_store=store,
260
+ )
261
+ return _cache[name]
262
+ elif name == "fetch_stablecoin_chains":
263
+ if name not in _cache:
264
+ _cache[name] = DefiLlamaFetchStablecoinChains(
265
+ skill_store=store,
266
+ )
267
+ return _cache[name]
268
+ elif name == "fetch_stablecoin_prices":
269
+ if name not in _cache:
270
+ _cache[name] = DefiLlamaFetchStablecoinPrices(
271
+ skill_store=store,
272
+ )
273
+ return _cache[name]
274
+
275
+ # Yields Skills
276
+ elif name == "fetch_pools":
277
+ if name not in _cache:
278
+ _cache[name] = DefiLlamaFetchPools(
279
+ skill_store=store,
280
+ )
281
+ return _cache[name]
282
+ elif name == "fetch_pool_chart":
283
+ if name not in _cache:
284
+ _cache[name] = DefiLlamaFetchPoolChart(
285
+ skill_store=store,
286
+ )
287
+ return _cache[name]
288
+
289
+ # Volumes Skills
290
+ elif name == "fetch_dex_overview": # Handles both base and chain-specific overviews
291
+ if name not in _cache:
292
+ _cache[name] = DefiLlamaFetchDexOverview(
293
+ skill_store=store,
294
+ )
295
+ return _cache[name]
296
+ elif name == "fetch_dex_summary":
297
+ if name not in _cache:
298
+ _cache[name] = DefiLlamaFetchDexSummary(
299
+ skill_store=store,
300
+ )
301
+ return _cache[name]
302
+ elif (
303
+ name == "fetch_options_overview"
304
+ ): # Handles both base and chain-specific overviews
305
+ if name not in _cache:
306
+ _cache[name] = DefiLlamaFetchOptionsOverview(
307
+ skill_store=store,
308
+ )
309
+ return _cache[name]
310
+
311
+ # Fees Skills
312
+ elif (
313
+ name == "fetch_fees_overview"
314
+ ): # Handles both base and chain-specific overviews
315
+ if name not in _cache:
316
+ _cache[name] = DefiLlamaFetchFeesOverview(
317
+ skill_store=store,
318
+ )
319
+ return _cache[name]
320
+
321
+ else:
322
+ logger.warning(f"Unknown DeFi Llama skill: {name}")
323
+ return None
@@ -0,0 +1,315 @@
1
+ """DeFi Llama API implementation and shared schemas."""
2
+
3
+ from datetime import datetime
4
+ from typing import List, Optional
5
+
6
+ import httpx
7
+
8
+ DEFILLAMA_TVL_BASE_URL = "https://api.llama.fi"
9
+ DEFILLAMA_COINS_BASE_URL = "https://coins.llama.fi"
10
+ DEFILLAMA_STABLECOINS_BASE_URL = "https://stablecoins.llama.fi"
11
+ DEFILLAMA_YIELDS_BASE_URL = "https://yields.llama.fi"
12
+ DEFILLAMA_VOLUMES_BASE_URL = "https://api.llama.fi"
13
+ DEFILLAMA_FEES_BASE_URL = "https://api.llama.fi"
14
+
15
+
16
+ # TVL API Functions
17
+ async def fetch_protocols() -> dict:
18
+ """List all protocols on defillama along with their TVL."""
19
+ url = f"{DEFILLAMA_TVL_BASE_URL}/protocols"
20
+ async with httpx.AsyncClient() as client:
21
+ response = await client.get(url)
22
+ if response.status_code != 200:
23
+ return {"error": f"API returned status code {response.status_code}"}
24
+ return response.json()
25
+
26
+
27
+ async def fetch_protocol(protocol: str) -> dict:
28
+ """Get historical TVL of a protocol and breakdowns by token and chain."""
29
+ url = f"{DEFILLAMA_TVL_BASE_URL}/protocol/{protocol}"
30
+ async with httpx.AsyncClient() as client:
31
+ response = await client.get(url)
32
+ if response.status_code != 200:
33
+ return {"error": f"API returned status code {response.status_code}"}
34
+ return response.json()
35
+
36
+
37
+ async def fetch_historical_tvl() -> dict:
38
+ """Get historical TVL of DeFi on all chains."""
39
+ url = f"{DEFILLAMA_TVL_BASE_URL}/v2/historicalChainTvl"
40
+ async with httpx.AsyncClient() as client:
41
+ response = await client.get(url)
42
+ if response.status_code != 200:
43
+ return {"error": f"API returned status code {response.status_code}"}
44
+ return response.json()
45
+
46
+
47
+ async def fetch_chain_historical_tvl(chain: str) -> dict:
48
+ """Get historical TVL of a specific chain."""
49
+ url = f"{DEFILLAMA_TVL_BASE_URL}/v2/historicalChainTvl/{chain}"
50
+ async with httpx.AsyncClient() as client:
51
+ response = await client.get(url)
52
+ if response.status_code != 200:
53
+ return {"error": f"API returned status code {response.status_code}"}
54
+ return response.json()
55
+
56
+
57
+ async def fetch_protocol_current_tvl(protocol: str) -> dict:
58
+ """Get current TVL of a protocol."""
59
+ url = f"{DEFILLAMA_TVL_BASE_URL}/tvl/{protocol}"
60
+ async with httpx.AsyncClient() as client:
61
+ response = await client.get(url)
62
+ if response.status_code != 200:
63
+ return {"error": f"API returned status code {response.status_code}"}
64
+ return response.json()
65
+
66
+
67
+ async def fetch_chains() -> dict:
68
+ """Get current TVL of all chains."""
69
+ url = f"{DEFILLAMA_TVL_BASE_URL}/v2/chains"
70
+ async with httpx.AsyncClient() as client:
71
+ response = await client.get(url)
72
+ if response.status_code != 200:
73
+ return {"error": f"API returned status code {response.status_code}"}
74
+ return response.json()
75
+
76
+
77
+ # Coins API Functions
78
+ async def fetch_current_prices(coins: List[str]) -> dict:
79
+ """Get current prices of tokens by contract address using a 4-hour search window."""
80
+ coins_str = ",".join(coins)
81
+ url = f"{DEFILLAMA_COINS_BASE_URL}/prices/current/{coins_str}?searchWidth=4h"
82
+
83
+ async with httpx.AsyncClient() as client:
84
+ response = await client.get(url)
85
+ if response.status_code != 200:
86
+ return {"error": f"API returned status code {response.status_code}"}
87
+ return response.json()
88
+
89
+
90
+ async def fetch_historical_prices(timestamp: int, coins: List[str]) -> dict:
91
+ """Get historical prices of tokens by contract address using a 4-hour search window."""
92
+ coins_str = ",".join(coins)
93
+ url = f"{DEFILLAMA_COINS_BASE_URL}/prices/historical/{timestamp}/{coins_str}?searchWidth=4h"
94
+
95
+ async with httpx.AsyncClient() as client:
96
+ response = await client.get(url)
97
+ if response.status_code != 200:
98
+ return {"error": f"API returned status code {response.status_code}"}
99
+ return response.json()
100
+
101
+
102
+ async def fetch_batch_historical_prices(coins_timestamps: dict) -> dict:
103
+ """Get historical prices for multiple tokens at multiple timestamps."""
104
+ url = f"{DEFILLAMA_COINS_BASE_URL}/batchHistorical"
105
+
106
+ async with httpx.AsyncClient() as client:
107
+ response = await client.get(
108
+ url, params={"coins": coins_timestamps, "searchWidth": "600"}
109
+ )
110
+ if response.status_code != 200:
111
+ return {"error": f"API returned status code {response.status_code}"}
112
+ return response.json()
113
+
114
+
115
+ async def fetch_price_chart(coins: List[str]) -> dict:
116
+ """Get historical price chart data from the past day for multiple tokens."""
117
+ coins_str = ",".join(coins)
118
+ start_time = int(datetime.now().timestamp()) - 86400 # now - 1 day
119
+
120
+ url = f"{DEFILLAMA_COINS_BASE_URL}/chart/{coins_str}"
121
+ params = {"start": start_time, "span": 10, "period": "2d", "searchWidth": "600"}
122
+
123
+ async with httpx.AsyncClient() as client:
124
+ response = await client.get(url, params=params)
125
+ if response.status_code != 200:
126
+ return {"error": f"API returned status code {response.status_code}"}
127
+ return response.json()
128
+
129
+
130
+ async def fetch_price_percentage(coins: List[str]) -> dict:
131
+ """Get price percentage changes for multiple tokens over a 24h period."""
132
+ coins_str = ",".join(coins)
133
+ current_timestamp = int(datetime.now().timestamp())
134
+
135
+ url = f"{DEFILLAMA_COINS_BASE_URL}/percentage/{coins_str}"
136
+ params = {"timestamp": current_timestamp, "lookForward": "false", "period": "24h"}
137
+
138
+ async with httpx.AsyncClient() as client:
139
+ response = await client.get(url, params=params)
140
+ if response.status_code != 200:
141
+ return {"error": f"API returned status code {response.status_code}"}
142
+ return response.json()
143
+
144
+
145
+ async def fetch_first_price(coins: List[str]) -> dict:
146
+ """Get first recorded price data for multiple tokens."""
147
+ coins_str = ",".join(coins)
148
+ url = f"{DEFILLAMA_COINS_BASE_URL}/prices/first/{coins_str}"
149
+
150
+ async with httpx.AsyncClient() as client:
151
+ response = await client.get(url)
152
+ if response.status_code != 200:
153
+ return {"error": f"API returned status code {response.status_code}"}
154
+ return response.json()
155
+
156
+
157
+ async def fetch_block(chain: str) -> dict:
158
+ """Get current block data for a specific chain."""
159
+ current_timestamp = int(datetime.now().timestamp())
160
+ url = f"{DEFILLAMA_COINS_BASE_URL}/block/{chain}/{current_timestamp}"
161
+
162
+ async with httpx.AsyncClient() as client:
163
+ response = await client.get(url)
164
+ if response.status_code != 200:
165
+ return {"error": f"API returned status code {response.status_code}"}
166
+ return response.json()
167
+
168
+
169
+ # Stablecoins API Functions
170
+ async def fetch_stablecoins() -> dict:
171
+ """Get comprehensive stablecoin data from DeFi Llama."""
172
+ url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoins"
173
+ params = {"includePrices": "true"}
174
+
175
+ async with httpx.AsyncClient() as client:
176
+ response = await client.get(url, params=params)
177
+ if response.status_code != 200:
178
+ return {"error": f"API returned status code {response.status_code}"}
179
+ return response.json()
180
+
181
+
182
+ async def fetch_stablecoin_charts(
183
+ stablecoin_id: str, chain: Optional[str] = None
184
+ ) -> dict:
185
+ """Get historical circulating supply data for a stablecoin."""
186
+ base_url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoincharts"
187
+
188
+ # If chain is specified, fetch chain-specific data, otherwise fetch all chains
189
+ endpoint = f"/{chain}" if chain else "/all"
190
+ url = f"{base_url}{endpoint}?stablecoin={stablecoin_id}"
191
+
192
+ async with httpx.AsyncClient() as client:
193
+ response = await client.get(url)
194
+ if response.status_code != 200:
195
+ return {"error": f"API returned status code {response.status_code}"}
196
+ return response.json()
197
+
198
+
199
+ async def fetch_stablecoin_chains() -> dict:
200
+ """Get stablecoin distribution data across all chains."""
201
+ url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoinchains"
202
+
203
+ async with httpx.AsyncClient() as client:
204
+ response = await client.get(url)
205
+ if response.status_code != 200:
206
+ return {"error": f"API returned status code {response.status_code}"}
207
+ return response.json()
208
+
209
+
210
+ async def fetch_stablecoin_prices() -> dict:
211
+ """Get current stablecoin price data.
212
+
213
+ Returns:
214
+ Dictionary containing stablecoin prices with their dates
215
+ """
216
+ url = f"{DEFILLAMA_STABLECOINS_BASE_URL}/stablecoinprices"
217
+
218
+ async with httpx.AsyncClient() as client:
219
+ response = await client.get(url)
220
+ if response.status_code != 200:
221
+ return {"error": f"API returned status code {response.status_code}"}
222
+ return response.json()
223
+
224
+
225
+ # Yields API Functions
226
+ async def fetch_pools() -> dict:
227
+ """Get comprehensive data for all yield-generating pools."""
228
+ url = f"{DEFILLAMA_YIELDS_BASE_URL}/pools"
229
+
230
+ async with httpx.AsyncClient() as client:
231
+ response = await client.get(url)
232
+ if response.status_code != 200:
233
+ return {"error": f"API returned status code {response.status_code}"}
234
+ return response.json()
235
+
236
+
237
+ async def fetch_pool_chart(pool_id: str) -> dict:
238
+ """Get historical chart data for a specific pool."""
239
+ url = f"{DEFILLAMA_YIELDS_BASE_URL}/chart/{pool_id}"
240
+
241
+ async with httpx.AsyncClient() as client:
242
+ response = await client.get(url)
243
+ if response.status_code != 200:
244
+ return {"error": f"API returned status code {response.status_code}"}
245
+ return response.json()
246
+
247
+
248
+ # Volumes API Functions
249
+ async def fetch_dex_overview() -> dict:
250
+ """Get overview data for DEX protocols."""
251
+ url = f"{DEFILLAMA_VOLUMES_BASE_URL}/overview/dexs"
252
+ params = {
253
+ "excludeTotalDataChart": "true",
254
+ "excludeTotalDataChartBreakdown": "true",
255
+ "dataType": "dailyVolume",
256
+ }
257
+
258
+ async with httpx.AsyncClient() as client:
259
+ response = await client.get(url, params=params)
260
+ if response.status_code != 200:
261
+ return {"error": f"API returned status code {response.status_code}"}
262
+ return response.json()
263
+
264
+
265
+ async def fetch_dex_summary(protocol: str) -> dict:
266
+ """Get summary data for a specific DEX protocol."""
267
+ url = f"{DEFILLAMA_VOLUMES_BASE_URL}/summary/dexs/{protocol}"
268
+ params = {
269
+ "excludeTotalDataChart": "true",
270
+ "excludeTotalDataChartBreakdown": "true",
271
+ "dataType": "dailyVolume",
272
+ }
273
+
274
+ async with httpx.AsyncClient() as client:
275
+ response = await client.get(url, params=params)
276
+ if response.status_code != 200:
277
+ return {"error": f"API returned status code {response.status_code}"}
278
+ return response.json()
279
+
280
+
281
+ async def fetch_options_overview() -> dict:
282
+ """Get overview data for options protocols from DeFi Llama."""
283
+ url = f"{DEFILLAMA_VOLUMES_BASE_URL}/overview/options"
284
+ params = {
285
+ "excludeTotalDataChart": "true",
286
+ "excludeTotalDataChartBreakdown": "true",
287
+ "dataType": "dailyPremiumVolume",
288
+ }
289
+
290
+ async with httpx.AsyncClient() as client:
291
+ response = await client.get(url, params=params)
292
+ if response.status_code != 200:
293
+ return {"error": f"API returned status code {response.status_code}"}
294
+ return response.json()
295
+
296
+
297
+ # Fees and Revenue API Functions
298
+ async def fetch_fees_overview() -> dict:
299
+ """Get overview data for fees from DeFi Llama.
300
+
301
+ Returns:
302
+ Dictionary containing fees overview data
303
+ """
304
+ url = f"{DEFILLAMA_FEES_BASE_URL}/overview/fees"
305
+ params = {
306
+ "excludeTotalDataChart": "true",
307
+ "excludeTotalDataChartBreakdown": "true",
308
+ "dataType": "dailyFees",
309
+ }
310
+
311
+ async with httpx.AsyncClient() as client:
312
+ response = await client.get(url, params=params)
313
+ if response.status_code != 200:
314
+ return {"error": f"API returned status code {response.status_code}"}
315
+ return response.json()