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.
- intentkit/__init__.py +1 -1
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +14 -7
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +5 -2
- intentkit/clients/cdp.py +101 -141
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +29 -0
- intentkit/config/config.py +8 -5
- intentkit/core/agent.py +472 -195
- intentkit/core/asset.py +253 -0
- intentkit/core/chat.py +51 -0
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +460 -130
- intentkit/core/engine.py +262 -233
- intentkit/core/node.py +15 -16
- intentkit/core/prompt.py +62 -28
- intentkit/core/scheduler.py +92 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +1096 -949
- intentkit/models/agent_data.py +68 -38
- intentkit/models/agent_public.json +98 -0
- intentkit/models/agent_schema.json +54 -439
- intentkit/models/app_setting.py +96 -33
- intentkit/models/chat.py +74 -27
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +362 -74
- intentkit/models/db.py +26 -8
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +28 -0
- intentkit/models/llm.py +185 -350
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +186 -72
- intentkit/models/skills.csv +174 -0
- intentkit/models/user.py +82 -24
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/acolyt/schema.json +4 -3
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/aixbt/schema.json +4 -4
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/allora/schema.json +3 -2
- intentkit/skills/base.py +248 -85
- intentkit/skills/basename/__init__.py +51 -0
- intentkit/skills/basename/base.py +11 -0
- intentkit/skills/basename/basename.svg +11 -0
- intentkit/skills/basename/schema.json +58 -0
- intentkit/skills/carv/__init__.py +115 -121
- intentkit/skills/carv/base.py +184 -185
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/schema.json +134 -137
- intentkit/skills/carv/token_info_and_price.py +5 -5
- intentkit/skills/casino/README.md +254 -0
- intentkit/skills/casino/__init__.py +86 -0
- intentkit/skills/casino/base.py +17 -0
- intentkit/skills/casino/casino.png +0 -0
- intentkit/skills/casino/deck_draw.py +127 -0
- intentkit/skills/casino/deck_shuffle.py +118 -0
- intentkit/skills/casino/dice_roll.py +100 -0
- intentkit/skills/casino/schema.json +77 -0
- intentkit/skills/casino/utils.py +107 -0
- intentkit/skills/cdp/__init__.py +22 -84
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +11 -314
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/chainlist/schema.json +3 -5
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/common/schema.json +2 -2
- intentkit/skills/cookiefun/__init__.py +6 -9
- intentkit/skills/cookiefun/base.py +2 -7
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/schema.json +1 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +11 -25
- intentkit/skills/cryptocompare/fetch_news.py +4 -5
- intentkit/skills/cryptocompare/fetch_price.py +6 -7
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
- intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
- intentkit/skills/cryptocompare/schema.json +3 -3
- intentkit/skills/cryptopanic/__init__.py +7 -10
- intentkit/skills/cryptopanic/base.py +51 -55
- intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
- intentkit/skills/cryptopanic/schema.json +105 -103
- intentkit/skills/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/dapplooker/schema.json +3 -5
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +11 -21
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_block.py +6 -8
- intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
- intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
- intentkit/skills/defillama/schema.json +5 -1
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
- intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
- intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
- intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
- intentkit/skills/defillama/yields/fetch_pools.py +26 -30
- intentkit/skills/dexscreener/README.md +154 -0
- intentkit/skills/dexscreener/__init__.py +97 -93
- intentkit/skills/dexscreener/base.py +125 -133
- intentkit/skills/dexscreener/get_pair_info.py +158 -0
- intentkit/skills/dexscreener/get_token_pairs.py +165 -0
- intentkit/skills/dexscreener/get_tokens_info.py +212 -0
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -48
- intentkit/skills/dexscreener/search_token.py +182 -321
- intentkit/skills/dexscreener/utils.py +420 -0
- intentkit/skills/dune_analytics/__init__.py +7 -9
- intentkit/skills/dune_analytics/base.py +48 -52
- intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
- intentkit/skills/dune_analytics/schema.json +104 -99
- intentkit/skills/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/schema.json +3 -2
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +26 -28
- intentkit/skills/enso/__init__.py +11 -31
- intentkit/skills/enso/base.py +50 -35
- intentkit/skills/enso/best_yield.py +16 -24
- intentkit/skills/enso/networks.py +6 -11
- intentkit/skills/enso/prices.py +11 -13
- intentkit/skills/enso/route.py +34 -38
- intentkit/skills/enso/schema.json +3 -2
- intentkit/skills/enso/tokens.py +29 -38
- intentkit/skills/enso/wallet.py +76 -191
- intentkit/skills/erc20/__init__.py +50 -0
- intentkit/skills/erc20/base.py +11 -0
- intentkit/skills/erc20/erc20.svg +5 -0
- intentkit/skills/erc20/schema.json +74 -0
- intentkit/skills/erc721/__init__.py +53 -0
- intentkit/skills/erc721/base.py +11 -0
- intentkit/skills/erc721/erc721.svg +5 -0
- intentkit/skills/erc721/schema.json +90 -0
- intentkit/skills/firecrawl/README.md +11 -5
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -11
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/schema.json +6 -8
- intentkit/skills/firecrawl/scrape.py +150 -40
- intentkit/skills/firecrawl/utils.py +50 -42
- intentkit/skills/github/__init__.py +2 -7
- intentkit/skills/github/base.py +1 -7
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/github/schema.json +3 -4
- intentkit/skills/heurist/__init__.py +8 -27
- intentkit/skills/heurist/base.py +4 -9
- intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
- intentkit/skills/heurist/image_generation_braindance.py +12 -13
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
- intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
- intentkit/skills/heurist/image_generation_sdxl.py +12 -13
- intentkit/skills/heurist/schema.json +2 -2
- intentkit/skills/http/__init__.py +4 -15
- intentkit/skills/http/base.py +1 -7
- intentkit/skills/http/get.py +21 -16
- intentkit/skills/http/post.py +23 -18
- intentkit/skills/http/put.py +23 -18
- intentkit/skills/http/schema.json +4 -5
- intentkit/skills/lifi/__init__.py +8 -13
- intentkit/skills/lifi/base.py +1 -7
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +36 -30
- intentkit/skills/lifi/token_quote.py +8 -10
- intentkit/skills/lifi/utils.py +104 -51
- intentkit/skills/moralis/__init__.py +6 -10
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +5 -10
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/moralis/schema.json +7 -2
- intentkit/skills/morpho/__init__.py +52 -0
- intentkit/skills/morpho/base.py +11 -0
- intentkit/skills/morpho/morpho.svg +12 -0
- intentkit/skills/morpho/schema.json +73 -0
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/nation/schema.json +4 -3
- intentkit/skills/onchain.py +23 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +3 -8
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +4 -8
- intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
- intentkit/skills/openai/gpt_image_to_image.py +4 -8
- intentkit/skills/openai/image_to_text.py +3 -7
- intentkit/skills/openai/schema.json +34 -3
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- intentkit/skills/portfolio/schema.json +3 -5
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +17 -18
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +31 -31
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +18 -18
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +50 -0
- intentkit/skills/pyth/base.py +11 -0
- intentkit/skills/pyth/pyth.svg +6 -0
- intentkit/skills/pyth/schema.json +75 -0
- intentkit/skills/skills.toml +40 -0
- intentkit/skills/slack/__init__.py +5 -17
- intentkit/skills/slack/base.py +3 -9
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/schema.json +2 -2
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +9 -13
- intentkit/skills/supabase/delete_data.py +5 -6
- intentkit/skills/supabase/fetch_data.py +13 -14
- intentkit/skills/supabase/insert_data.py +5 -6
- intentkit/skills/supabase/invoke_function.py +7 -8
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +7 -8
- intentkit/skills/supabase/upsert_data.py +5 -6
- intentkit/skills/superfluid/__init__.py +53 -0
- intentkit/skills/superfluid/base.py +11 -0
- intentkit/skills/superfluid/schema.json +89 -0
- intentkit/skills/superfluid/superfluid.svg +6 -0
- intentkit/skills/system/__init__.py +7 -24
- intentkit/skills/system/add_autonomous_task.py +10 -12
- intentkit/skills/system/delete_autonomous_task.py +2 -2
- intentkit/skills/system/edit_autonomous_task.py +14 -18
- intentkit/skills/system/list_autonomous_tasks.py +3 -5
- intentkit/skills/system/read_agent_api_key.py +6 -4
- intentkit/skills/system/regenerate_agent_api_key.py +6 -4
- intentkit/skills/system/schema.json +6 -8
- intentkit/skills/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- intentkit/skills/tavily/schema.json +3 -5
- intentkit/skills/tavily/tavily_extract.py +2 -4
- intentkit/skills/tavily/tavily_search.py +4 -6
- intentkit/skills/token/__init__.py +5 -10
- intentkit/skills/token/base.py +7 -11
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/schema.json +3 -6
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/__init__.py +11 -35
- intentkit/skills/twitter/base.py +23 -35
- intentkit/skills/twitter/follow_user.py +3 -7
- intentkit/skills/twitter/get_mentions.py +6 -13
- intentkit/skills/twitter/get_timeline.py +5 -13
- intentkit/skills/twitter/get_user_by_username.py +3 -7
- intentkit/skills/twitter/get_user_tweets.py +6 -14
- intentkit/skills/twitter/like_tweet.py +3 -7
- intentkit/skills/twitter/post_tweet.py +23 -12
- intentkit/skills/twitter/reply_tweet.py +21 -12
- intentkit/skills/twitter/retweet.py +3 -7
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +5 -13
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- intentkit/skills/unrealspeech/schema.json +2 -5
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +98 -106
- intentkit/skills/venice_audio/base.py +117 -121
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/schema.json +151 -152
- intentkit/skills/venice_audio/venice_audio.py +38 -21
- intentkit/skills/venice_image/__init__.py +147 -154
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +185 -192
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/schema.json +267 -267
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/__init__.py +5 -18
- intentkit/skills/web_scraper/base.py +21 -7
- intentkit/skills/web_scraper/document_indexer.py +7 -6
- intentkit/skills/web_scraper/schema.json +2 -6
- intentkit/skills/web_scraper/scrape_and_index.py +15 -15
- intentkit/skills/web_scraper/utils.py +62 -63
- intentkit/skills/web_scraper/website_indexer.py +17 -19
- intentkit/skills/weth/__init__.py +49 -0
- intentkit/skills/weth/base.py +11 -0
- intentkit/skills/weth/schema.json +58 -0
- intentkit/skills/weth/weth.svg +6 -0
- intentkit/skills/wow/__init__.py +51 -0
- intentkit/skills/wow/base.py +11 -0
- intentkit/skills/wow/schema.json +89 -0
- intentkit/skills/wow/wow.svg +7 -0
- intentkit/skills/x402/__init__.py +61 -0
- intentkit/skills/x402/ask_agent.py +98 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +45 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +61 -2
- intentkit/skills/xmtp/price.py +18 -13
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +22 -25
- intentkit/skills/xmtp/transfer.py +71 -32
- intentkit/utils/chain.py +3 -3
- intentkit/utils/error.py +14 -1
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +59 -7
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/abstracts/exception.py +0 -9
- intentkit/core/skill.py +0 -200
- intentkit/models/generator.py +0 -347
- intentkit/skills/cdp/get_balance.py +0 -110
- intentkit/skills/cdp/swap.py +0 -121
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +0 -511
- intentkit-0.6.13.dev2.dist-info/RECORD +0 -409
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"""Enso skills."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import NotRequired, TypedDict
|
|
5
5
|
|
|
6
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
6
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
8
7
|
from intentkit.skills.enso.base import EnsoBaseTool
|
|
9
8
|
from intentkit.skills.enso.best_yield import EnsoGetBestYield
|
|
@@ -36,13 +35,12 @@ class Config(SkillConfig):
|
|
|
36
35
|
|
|
37
36
|
states: SkillStates
|
|
38
37
|
api_token: NotRequired[str]
|
|
39
|
-
main_tokens:
|
|
38
|
+
main_tokens: NotRequired[list[str]]
|
|
40
39
|
|
|
41
40
|
|
|
42
41
|
async def get_skills(
|
|
43
42
|
config: Config,
|
|
44
43
|
is_private: bool,
|
|
45
|
-
store: SkillStoreABC,
|
|
46
44
|
**_,
|
|
47
45
|
) -> list[EnsoBaseTool]:
|
|
48
46
|
"""Get all Enso skills."""
|
|
@@ -58,7 +56,7 @@ async def get_skills(
|
|
|
58
56
|
# Get each skill using the cached getter
|
|
59
57
|
result = []
|
|
60
58
|
for name in available_skills:
|
|
61
|
-
skill = get_enso_skill(name
|
|
59
|
+
skill = get_enso_skill(name)
|
|
62
60
|
if skill:
|
|
63
61
|
result.append(skill)
|
|
64
62
|
return result
|
|
@@ -66,49 +64,31 @@ async def get_skills(
|
|
|
66
64
|
|
|
67
65
|
def get_enso_skill(
|
|
68
66
|
name: str,
|
|
69
|
-
skill_store: SkillStoreABC,
|
|
70
67
|
) -> EnsoBaseTool:
|
|
71
68
|
"""Get an Enso skill by name.
|
|
72
69
|
|
|
73
70
|
Args:
|
|
74
71
|
name: The name of the skill to get
|
|
75
|
-
skill_store: The skill store for persisting data
|
|
76
72
|
|
|
77
73
|
Returns:
|
|
78
74
|
The requested Enso skill
|
|
79
75
|
"""
|
|
80
76
|
if name == "get_networks":
|
|
81
|
-
return EnsoGetNetworks(
|
|
82
|
-
skill_store=skill_store,
|
|
83
|
-
)
|
|
77
|
+
return EnsoGetNetworks()
|
|
84
78
|
if name == "get_tokens":
|
|
85
|
-
return EnsoGetTokens(
|
|
86
|
-
skill_store=skill_store,
|
|
87
|
-
)
|
|
79
|
+
return EnsoGetTokens()
|
|
88
80
|
if name == "get_prices":
|
|
89
|
-
return EnsoGetPrices(
|
|
90
|
-
skill_store=skill_store,
|
|
91
|
-
)
|
|
81
|
+
return EnsoGetPrices()
|
|
92
82
|
if name == "get_wallet_approvals":
|
|
93
|
-
return EnsoGetWalletApprovals(
|
|
94
|
-
skill_store=skill_store,
|
|
95
|
-
)
|
|
83
|
+
return EnsoGetWalletApprovals()
|
|
96
84
|
if name == "get_wallet_balances":
|
|
97
|
-
return EnsoGetWalletBalances(
|
|
98
|
-
skill_store=skill_store,
|
|
99
|
-
)
|
|
85
|
+
return EnsoGetWalletBalances()
|
|
100
86
|
if name == "wallet_approve":
|
|
101
|
-
return EnsoWalletApprove(
|
|
102
|
-
skill_store=skill_store,
|
|
103
|
-
)
|
|
87
|
+
return EnsoWalletApprove()
|
|
104
88
|
if name == "route_shortcut":
|
|
105
|
-
return EnsoRouteShortcut(
|
|
106
|
-
skill_store=skill_store,
|
|
107
|
-
)
|
|
89
|
+
return EnsoRouteShortcut()
|
|
108
90
|
if name == "get_best_yield":
|
|
109
|
-
return EnsoGetBestYield(
|
|
110
|
-
skill_store=skill_store,
|
|
111
|
-
)
|
|
91
|
+
return EnsoGetBestYield()
|
|
112
92
|
else:
|
|
113
93
|
logger.warning(f"Unknown Enso skill: {name}")
|
|
114
94
|
return None
|
intentkit/skills/enso/base.py
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
from
|
|
1
|
+
from decimal import Decimal
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
from
|
|
5
|
-
from langchain.tools.base import ToolException
|
|
3
|
+
from coinbase_agentkit import CdpEvmWalletProvider
|
|
4
|
+
from langchain_core.tools.base import ToolException
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
8
7
|
from intentkit.abstracts.graph import AgentContext
|
|
9
|
-
from intentkit.
|
|
10
|
-
from intentkit.
|
|
8
|
+
from intentkit.clients import get_wallet_provider as get_agent_wallet_provider
|
|
9
|
+
from intentkit.config.config import config
|
|
11
10
|
from intentkit.skills.base import IntentKitSkill
|
|
12
|
-
from intentkit.utils.chain import ChainProvider,
|
|
11
|
+
from intentkit.utils.chain import ChainProvider, Network, network_to_id
|
|
13
12
|
|
|
14
13
|
base_url = "https://api.enso.finance"
|
|
15
|
-
default_chain_id = int(NetworkId.BaseMainnet)
|
|
16
14
|
|
|
17
15
|
|
|
18
16
|
class EnsoBaseTool(IntentKitSkill):
|
|
@@ -20,39 +18,25 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
20
18
|
|
|
21
19
|
name: str = Field(description="The name of the tool")
|
|
22
20
|
description: str = Field(description="A description of what the tool does")
|
|
23
|
-
args_schema:
|
|
24
|
-
skill_store: SkillStoreABC = Field(
|
|
25
|
-
description="The skill store for persisting data"
|
|
26
|
-
)
|
|
21
|
+
args_schema: type[BaseModel]
|
|
27
22
|
|
|
28
|
-
async def
|
|
29
|
-
"""Get the account object from the CDP client.
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
context: The skill context containing agent information.
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
Optional[EvmServerAccount]: The account object if available.
|
|
36
|
-
"""
|
|
37
|
-
client: CdpClient = await get_cdp_client(context.agent.id, self.skill_store)
|
|
38
|
-
return await client.get_account()
|
|
39
|
-
|
|
40
|
-
async def get_wallet_provider(
|
|
41
|
-
self, context: AgentContext
|
|
42
|
-
) -> Optional[CdpEvmServerWalletProvider]:
|
|
23
|
+
async def get_wallet_provider(self, context: AgentContext) -> CdpEvmWalletProvider:
|
|
43
24
|
"""Get the wallet provider from the CDP client.
|
|
44
25
|
|
|
45
26
|
Args:
|
|
46
27
|
context: The skill context containing agent information.
|
|
47
28
|
|
|
48
29
|
Returns:
|
|
49
|
-
|
|
30
|
+
CdpEvmWalletProvider | None: The wallet provider if available.
|
|
50
31
|
"""
|
|
51
|
-
|
|
52
|
-
return await client.get_wallet_provider()
|
|
32
|
+
return await get_agent_wallet_provider(context.agent)
|
|
53
33
|
|
|
54
|
-
def
|
|
55
|
-
|
|
34
|
+
async def get_wallet_address(self, context: AgentContext) -> str:
|
|
35
|
+
provider: CdpEvmWalletProvider = await self.get_wallet_provider(context)
|
|
36
|
+
return provider.get_address()
|
|
37
|
+
|
|
38
|
+
def get_chain_provider(self, context: AgentContext) -> ChainProvider | None:
|
|
39
|
+
return config.chain_provider
|
|
56
40
|
|
|
57
41
|
def get_main_tokens(self, context: AgentContext) -> list[str]:
|
|
58
42
|
skill_config = context.agent.skill_config(self.category)
|
|
@@ -60,12 +44,11 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
60
44
|
return skill_config["main_tokens"]
|
|
61
45
|
return []
|
|
62
46
|
|
|
63
|
-
def
|
|
64
|
-
context = self.get_context()
|
|
47
|
+
def get_api_token(self, context: AgentContext) -> str:
|
|
65
48
|
skill_config = context.agent.skill_config(self.category)
|
|
66
49
|
api_key_provider = skill_config.get("api_key_provider")
|
|
67
50
|
if api_key_provider == "platform":
|
|
68
|
-
return
|
|
51
|
+
return config.enso_api_token
|
|
69
52
|
# for backward compatibility, may only have api_token in skill_config
|
|
70
53
|
elif skill_config.get("api_token"):
|
|
71
54
|
return skill_config.get("api_token")
|
|
@@ -74,6 +57,38 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
74
57
|
f"Invalid API key provider: {api_key_provider}, or no api_token in config"
|
|
75
58
|
)
|
|
76
59
|
|
|
60
|
+
def resolve_chain_id(
|
|
61
|
+
self, context: AgentContext, chain_id: int | None = None
|
|
62
|
+
) -> int:
|
|
63
|
+
if chain_id:
|
|
64
|
+
return chain_id
|
|
65
|
+
|
|
66
|
+
agent = context.agent
|
|
67
|
+
try:
|
|
68
|
+
network = Network(agent.network_id)
|
|
69
|
+
except ValueError as exc: # pragma: no cover - defensive
|
|
70
|
+
raise ToolException(
|
|
71
|
+
f"Unsupported network configured for agent: {agent.network_id}"
|
|
72
|
+
) from exc
|
|
73
|
+
|
|
74
|
+
network_id = network_to_id.get(network)
|
|
75
|
+
if network_id is None:
|
|
76
|
+
raise ToolException(
|
|
77
|
+
f"Unable to determine chain id for network: {agent.network_id}"
|
|
78
|
+
)
|
|
79
|
+
return int(network_id)
|
|
80
|
+
|
|
77
81
|
@property
|
|
78
82
|
def category(self) -> str:
|
|
79
83
|
return "enso"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def format_amount_with_decimals(amount: object, decimals: int | None) -> str | None:
|
|
87
|
+
if amount is None or decimals is None:
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
value = Decimal(str(amount)) / (Decimal(10) ** decimals)
|
|
92
|
+
return format(value, "f")
|
|
93
|
+
except Exception: # pragma: no cover - defensive
|
|
94
|
+
return None
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
from typing import List, Optional, Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
|
-
from intentkit.skills.enso.base import
|
|
8
|
-
EnsoBaseTool,
|
|
9
|
-
base_url,
|
|
10
|
-
)
|
|
11
|
-
from intentkit.utils.chain import NetworkId
|
|
12
|
-
|
|
13
|
-
# Chain ID for Base Mainnet
|
|
14
|
-
BASE_CHAIN_ID = int(NetworkId.BaseMainnet)
|
|
5
|
+
from intentkit.skills.enso.base import EnsoBaseTool, base_url
|
|
15
6
|
|
|
16
7
|
|
|
17
8
|
class EnsoGetBestYieldInput(BaseModel):
|
|
@@ -21,9 +12,9 @@ class EnsoGetBestYieldInput(BaseModel):
|
|
|
21
12
|
"USDC",
|
|
22
13
|
description="Symbol of the token to find the best yield for (e.g., 'USDC', 'ETH', 'USDT')",
|
|
23
14
|
)
|
|
24
|
-
chain_id: int = Field(
|
|
25
|
-
|
|
26
|
-
description="The blockchain chain ID.
|
|
15
|
+
chain_id: int | None = Field(
|
|
16
|
+
None,
|
|
17
|
+
description="The blockchain chain ID. Defaults to the agent's configured network.",
|
|
27
18
|
)
|
|
28
19
|
top_n: int = Field(
|
|
29
20
|
5,
|
|
@@ -47,8 +38,8 @@ class YieldOption(BaseModel):
|
|
|
47
38
|
None, description="Primary contract address for interacting with the protocol"
|
|
48
39
|
)
|
|
49
40
|
apy: float = Field(None, description="Annual Percentage Yield")
|
|
50
|
-
tvl:
|
|
51
|
-
underlying_tokens:
|
|
41
|
+
tvl: float | None = Field(None, description="Total Value Locked in the protocol")
|
|
42
|
+
underlying_tokens: list[str] = Field(
|
|
52
43
|
[], description="List of underlying token symbols"
|
|
53
44
|
)
|
|
54
45
|
|
|
@@ -56,7 +47,7 @@ class YieldOption(BaseModel):
|
|
|
56
47
|
class EnsoGetBestYieldOutput(BaseModel):
|
|
57
48
|
"""Output containing the best yield options."""
|
|
58
49
|
|
|
59
|
-
best_options:
|
|
50
|
+
best_options: list[YieldOption] = Field(
|
|
60
51
|
[], description="List of best yield options sorted by APY (descending)"
|
|
61
52
|
)
|
|
62
53
|
token_symbol: str = Field(None, description="Symbol of the token searched for")
|
|
@@ -75,12 +66,12 @@ class EnsoGetBestYield(EnsoBaseTool):
|
|
|
75
66
|
"Find the best yield options for a specific token (default: USDC) across all protocols "
|
|
76
67
|
"on a blockchain network (default: Base). Results are sorted by APY in descending order."
|
|
77
68
|
)
|
|
78
|
-
args_schema:
|
|
69
|
+
args_schema: type[BaseModel] = EnsoGetBestYieldInput
|
|
79
70
|
|
|
80
71
|
async def _arun(
|
|
81
72
|
self,
|
|
82
73
|
token_symbol: str = "USDC",
|
|
83
|
-
chain_id: int =
|
|
74
|
+
chain_id: int | None = None,
|
|
84
75
|
top_n: int = 5,
|
|
85
76
|
**kwargs,
|
|
86
77
|
) -> EnsoGetBestYieldOutput:
|
|
@@ -89,7 +80,7 @@ class EnsoGetBestYield(EnsoBaseTool):
|
|
|
89
80
|
|
|
90
81
|
Args:
|
|
91
82
|
token_symbol (str): Symbol of the token to find the best yield for (default: USDC)
|
|
92
|
-
chain_id (int): The chain id of the network
|
|
83
|
+
chain_id (int | None): The chain id of the network. Defaults to the agent's configured network.
|
|
93
84
|
top_n (int): Number of top yield options to return
|
|
94
85
|
|
|
95
86
|
Returns:
|
|
@@ -99,16 +90,17 @@ class EnsoGetBestYield(EnsoBaseTool):
|
|
|
99
90
|
ToolException: If there's an error accessing the Enso API.
|
|
100
91
|
"""
|
|
101
92
|
context = self.get_context()
|
|
93
|
+
resolved_chain_id = self.resolve_chain_id(context, chain_id)
|
|
102
94
|
api_token = self.get_api_token(context)
|
|
103
95
|
|
|
104
96
|
if not api_token:
|
|
105
97
|
raise ToolException("No API token found for Enso Finance")
|
|
106
98
|
|
|
107
99
|
# Get the chain name for the given chain ID
|
|
108
|
-
chain_name = await self._get_chain_name(api_token,
|
|
100
|
+
chain_name = await self._get_chain_name(api_token, resolved_chain_id)
|
|
109
101
|
|
|
110
102
|
# Get all protocols on the specified chain
|
|
111
|
-
protocols = await self._get_protocols(api_token,
|
|
103
|
+
protocols = await self._get_protocols(api_token, resolved_chain_id)
|
|
112
104
|
|
|
113
105
|
# Collect all yield options from all protocols
|
|
114
106
|
all_yield_options = []
|
|
@@ -119,7 +111,7 @@ class EnsoGetBestYield(EnsoBaseTool):
|
|
|
119
111
|
|
|
120
112
|
# Get yield-bearing tokens for this protocol
|
|
121
113
|
tokens = await self._get_protocol_tokens(
|
|
122
|
-
api_token,
|
|
114
|
+
api_token, resolved_chain_id, protocol_slug, token_symbol
|
|
123
115
|
)
|
|
124
116
|
|
|
125
117
|
# Process tokens to extract yield options
|
|
@@ -170,7 +162,7 @@ class EnsoGetBestYield(EnsoBaseTool):
|
|
|
170
162
|
return EnsoGetBestYieldOutput(
|
|
171
163
|
best_options=top_options,
|
|
172
164
|
token_symbol=token_symbol,
|
|
173
|
-
chain_id=
|
|
165
|
+
chain_id=resolved_chain_id,
|
|
174
166
|
chain_name=chain_name,
|
|
175
167
|
)
|
|
176
168
|
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Type
|
|
3
2
|
|
|
4
3
|
import httpx
|
|
5
|
-
from
|
|
4
|
+
from langchain_core.tools.base import ToolException
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
8
7
|
from .base import EnsoBaseTool, base_url
|
|
9
8
|
|
|
10
|
-
logger = logging.getLogger(__name__)
|
|
11
|
-
|
|
12
9
|
|
|
13
10
|
class EnsoGetNetworksInput(BaseModel):
|
|
14
11
|
"""
|
|
@@ -38,6 +35,9 @@ class EnsoGetNetworksOutput(BaseModel):
|
|
|
38
35
|
)
|
|
39
36
|
|
|
40
37
|
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
41
|
class EnsoGetNetworks(EnsoBaseTool):
|
|
42
42
|
"""
|
|
43
43
|
Tool for retrieving networks and their corresponding chainId, the output should be kept.
|
|
@@ -45,7 +45,7 @@ class EnsoGetNetworks(EnsoBaseTool):
|
|
|
45
45
|
|
|
46
46
|
name: str = "enso_get_networks"
|
|
47
47
|
description: str = "Retrieve networks supported by the Enso API"
|
|
48
|
-
args_schema:
|
|
48
|
+
args_schema: type[BaseModel] = EnsoGetNetworksInput
|
|
49
49
|
|
|
50
50
|
async def _arun(self, **kwargs) -> EnsoGetNetworksOutput:
|
|
51
51
|
"""
|
|
@@ -82,12 +82,7 @@ class EnsoGetNetworks(EnsoBaseTool):
|
|
|
82
82
|
exclude_none=True
|
|
83
83
|
)
|
|
84
84
|
|
|
85
|
-
await self.
|
|
86
|
-
context.agent_id,
|
|
87
|
-
"enso_get_networks",
|
|
88
|
-
"networks",
|
|
89
|
-
networks_memory,
|
|
90
|
-
)
|
|
85
|
+
await self.save_agent_skill_data("networks", networks_memory)
|
|
91
86
|
|
|
92
87
|
return EnsoGetNetworksOutput(res=networks)
|
|
93
88
|
except httpx.RequestError as req_err:
|
intentkit/skills/enso/prices.py
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
|
-
from .base import EnsoBaseTool, base_url
|
|
5
|
+
from .base import EnsoBaseTool, base_url
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class EnsoGetPricesInput(BaseModel):
|
|
11
|
-
chainId: int = Field(
|
|
12
|
-
default_chain_id, description="Blockchain chain ID of the token"
|
|
13
|
-
)
|
|
9
|
+
chainId: int | None = Field(None, description="Blockchain chain ID of the token")
|
|
14
10
|
address: str = Field(
|
|
15
11
|
"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
|
|
16
12
|
description="Contract address of the token",
|
|
@@ -38,27 +34,26 @@ class EnsoGetPrices(EnsoBaseTool):
|
|
|
38
34
|
|
|
39
35
|
name: str = "enso_get_prices"
|
|
40
36
|
description: str = "Retrieve the price of a token by chain ID and contract address"
|
|
41
|
-
args_schema:
|
|
37
|
+
args_schema: type[BaseModel] = EnsoGetPricesInput
|
|
42
38
|
|
|
43
39
|
async def _arun(
|
|
44
40
|
self,
|
|
45
41
|
address: str,
|
|
46
|
-
chainId: int =
|
|
42
|
+
chainId: int | None = None,
|
|
47
43
|
**kwargs,
|
|
48
44
|
) -> EnsoGetPricesOutput:
|
|
49
45
|
"""
|
|
50
46
|
Asynchronous function to request the token price from the API.
|
|
51
47
|
|
|
52
48
|
Args:
|
|
53
|
-
chainId (int): The blockchain's chain ID.
|
|
49
|
+
chainId (int | None): The blockchain's chain ID. Defaults to the agent's configured network.
|
|
54
50
|
address (str): Contract address of the token.
|
|
55
51
|
|
|
56
52
|
Returns:
|
|
57
53
|
EnsoGetPricesOutput: Token price response or error message.
|
|
58
54
|
"""
|
|
59
|
-
url = f"{base_url}/api/v1/prices/{str(chainId)}/{address}"
|
|
60
|
-
|
|
61
55
|
context = self.get_context()
|
|
56
|
+
resolved_chain_id = self.resolve_chain_id(context, chainId)
|
|
62
57
|
api_token = self.get_api_token(context)
|
|
63
58
|
|
|
64
59
|
headers = {
|
|
@@ -68,7 +63,10 @@ class EnsoGetPrices(EnsoBaseTool):
|
|
|
68
63
|
|
|
69
64
|
async with httpx.AsyncClient() as client:
|
|
70
65
|
try:
|
|
71
|
-
response = await client.get(
|
|
66
|
+
response = await client.get(
|
|
67
|
+
f"{base_url}/api/v1/prices/{str(resolved_chain_id)}/{address}",
|
|
68
|
+
headers=headers,
|
|
69
|
+
)
|
|
72
70
|
response.raise_for_status()
|
|
73
71
|
json_dict = response.json()
|
|
74
72
|
|
intentkit/skills/enso/route.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from intentkit.skills.enso.networks import EnsoGetNetworks
|
|
8
6
|
|
|
9
|
-
from .base import EnsoBaseTool, base_url,
|
|
7
|
+
from .base import EnsoBaseTool, base_url, format_amount_with_decimals
|
|
10
8
|
|
|
11
9
|
|
|
12
10
|
class EnsoRouteShortcutInput(BaseModel):
|
|
@@ -18,9 +16,9 @@ class EnsoRouteShortcutInput(BaseModel):
|
|
|
18
16
|
False,
|
|
19
17
|
description="Whether to broadcast the transaction or not, this is false by default.",
|
|
20
18
|
)
|
|
21
|
-
chainId: int = Field(
|
|
22
|
-
|
|
23
|
-
description="(Optional) Chain ID of the network to execute the transaction on.
|
|
19
|
+
chainId: int | None = Field(
|
|
20
|
+
None,
|
|
21
|
+
description="(Optional) Chain ID of the network to execute the transaction on. Defaults to the agent's configured network.",
|
|
24
22
|
)
|
|
25
23
|
amountIn: list[int] = Field(
|
|
26
24
|
description="Amount of tokenIn to swap in wei, you should multiply user's requested value by token decimals."
|
|
@@ -155,14 +153,14 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
155
153
|
|
|
156
154
|
name: str = "enso_route_shortcut"
|
|
157
155
|
description: str = "This tool is used specifically for broadcasting a route transaction calldata to the network. It should only be used when the user explicitly requests to broadcast a route transaction with routeId."
|
|
158
|
-
args_schema:
|
|
156
|
+
args_schema: type[BaseModel] = EnsoRouteShortcutInput
|
|
159
157
|
|
|
160
158
|
async def _arun(
|
|
161
159
|
self,
|
|
162
160
|
amountIn: list[int],
|
|
163
161
|
tokenIn: list[str],
|
|
164
162
|
tokenOut: list[str],
|
|
165
|
-
chainId: int =
|
|
163
|
+
chainId: int | None = None,
|
|
166
164
|
broadcast_requested: bool = False,
|
|
167
165
|
**kwargs,
|
|
168
166
|
) -> EnsoRouteShortcutOutput:
|
|
@@ -173,7 +171,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
173
171
|
amountIn (list[int]): Amount of tokenIn to swap in wei, you should multiply user's requested value by token decimals.
|
|
174
172
|
tokenIn (list[str]): Ethereum address of the token to swap or enter into a position from (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee).
|
|
175
173
|
tokenOut (list[str]): Ethereum address of the token to swap or enter into a position to (For ETH, use 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee).
|
|
176
|
-
chainId (int): The chain id of the network to be used for swap, deposit and routing.
|
|
174
|
+
chainId (int | None): The chain id of the network to be used for swap, deposit and routing. Defaults to the agent's configured network.
|
|
177
175
|
broadcast_requested (bool): User should ask for broadcasting the transaction explicitly, otherwise it is always false.
|
|
178
176
|
|
|
179
177
|
Returns:
|
|
@@ -181,35 +179,36 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
181
179
|
"""
|
|
182
180
|
|
|
183
181
|
context = self.get_context()
|
|
184
|
-
|
|
182
|
+
resolved_chain_id = self.resolve_chain_id(context, chainId)
|
|
185
183
|
api_token = self.get_api_token(context)
|
|
186
|
-
|
|
184
|
+
# Use the wallet provider to send the transaction
|
|
185
|
+
wallet_provider = await self.get_wallet_provider(context)
|
|
186
|
+
wallet_address = wallet_provider.get_address()
|
|
187
187
|
|
|
188
188
|
async with httpx.AsyncClient() as client:
|
|
189
189
|
try:
|
|
190
190
|
network_name = None
|
|
191
|
-
networks = await self.
|
|
192
|
-
|
|
191
|
+
networks = await self.get_agent_skill_data_raw(
|
|
192
|
+
"enso_get_networks", "networks"
|
|
193
193
|
)
|
|
194
194
|
|
|
195
195
|
if networks:
|
|
196
|
+
resolved_key = str(resolved_chain_id)
|
|
196
197
|
network_name = (
|
|
197
|
-
networks.get(
|
|
198
|
-
if networks.get(
|
|
198
|
+
networks.get(resolved_key).get("name")
|
|
199
|
+
if networks.get(resolved_key)
|
|
199
200
|
else None
|
|
200
201
|
)
|
|
201
202
|
if network_name is None:
|
|
202
|
-
networks = await EnsoGetNetworks(
|
|
203
|
-
skill_store=self.skill_store,
|
|
204
|
-
).arun()
|
|
203
|
+
networks = await EnsoGetNetworks().arun()
|
|
205
204
|
|
|
206
205
|
for network in networks.res:
|
|
207
|
-
if network.id ==
|
|
206
|
+
if network.id == resolved_chain_id:
|
|
208
207
|
network_name = network.name
|
|
209
208
|
|
|
210
209
|
if not network_name:
|
|
211
210
|
raise ToolException(
|
|
212
|
-
f"network name not found for chainId: {
|
|
211
|
+
f"network name not found for chainId: {resolved_chain_id}"
|
|
213
212
|
)
|
|
214
213
|
|
|
215
214
|
headers = {
|
|
@@ -217,8 +216,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
217
216
|
"Authorization": f"Bearer {api_token}",
|
|
218
217
|
}
|
|
219
218
|
|
|
220
|
-
token_decimals = await self.
|
|
221
|
-
agent_id,
|
|
219
|
+
token_decimals = await self.get_agent_skill_data_raw(
|
|
222
220
|
"enso_get_tokens",
|
|
223
221
|
"decimals",
|
|
224
222
|
)
|
|
@@ -242,13 +240,13 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
242
240
|
|
|
243
241
|
# Prepare query parameters
|
|
244
242
|
params = EnsoRouteShortcutInput(
|
|
245
|
-
chainId=
|
|
243
|
+
chainId=resolved_chain_id,
|
|
246
244
|
amountIn=amountIn,
|
|
247
245
|
tokenIn=tokenIn,
|
|
248
246
|
tokenOut=tokenOut,
|
|
249
247
|
).model_dump(exclude_none=True)
|
|
250
248
|
|
|
251
|
-
params["fromAddress"] =
|
|
249
|
+
params["fromAddress"] = wallet_address
|
|
252
250
|
|
|
253
251
|
response = await client.get(url, headers=headers, params=params)
|
|
254
252
|
response.raise_for_status() # Raise HTTPError for non-2xx responses
|
|
@@ -256,26 +254,24 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
256
254
|
|
|
257
255
|
res = EnsoRouteShortcutOutput(**json_dict)
|
|
258
256
|
res.network = network_name
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
257
|
+
decimals = token_decimals.get(tokenOut[0])
|
|
258
|
+
amount_out = format_amount_with_decimals(
|
|
259
|
+
json_dict.get("amountOut"), decimals
|
|
262
260
|
)
|
|
261
|
+
if amount_out is not None:
|
|
262
|
+
res.amountOut = amount_out
|
|
263
263
|
|
|
264
264
|
if broadcast_requested:
|
|
265
|
-
# Use the wallet provider to send the transaction
|
|
266
|
-
wallet_provider = await self.get_wallet_provider(context)
|
|
267
|
-
|
|
268
265
|
# Extract transaction data from the Enso API response
|
|
269
266
|
tx_data = json_dict.get("tx", {})
|
|
270
267
|
if tx_data:
|
|
271
268
|
# Send the transaction using the wallet provider
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
)
|
|
269
|
+
tx_params = {
|
|
270
|
+
"to": tx_data.get("to"),
|
|
271
|
+
"data": tx_data.get("data", "0x"),
|
|
272
|
+
"value": tx_data.get("value", 0),
|
|
273
|
+
}
|
|
274
|
+
tx_hash = wallet_provider.send_transaction(tx_params)
|
|
279
275
|
|
|
280
276
|
# Wait for transaction confirmation
|
|
281
277
|
wallet_provider.wait_for_transaction_receipt(tx_hash)
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
"description": "Integration with Enso Finance API providing DeFi trading and portfolio management capabilities across multiple blockchain networks",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/enso/enso.jpg",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"DeFi"
|
|
9
10
|
],
|
|
10
11
|
"properties": {
|
|
11
12
|
"enabled": {
|
|
@@ -209,4 +210,4 @@
|
|
|
209
210
|
}
|
|
210
211
|
},
|
|
211
212
|
"additionalProperties": true
|
|
212
|
-
}
|
|
213
|
+
}
|