intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__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.
- intentkit/MANIFEST.in +14 -0
- intentkit/README.md +88 -0
- intentkit/__init__.py +6 -4
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +15 -8
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +9 -2
- intentkit/clients/cdp.py +129 -153
- intentkit/{utils → clients}/s3.py +109 -34
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +4 -7
- intentkit/config/config.py +123 -90
- intentkit/core/account_checking.py +802 -0
- intentkit/core/agent.py +313 -498
- intentkit/core/asset.py +267 -0
- intentkit/core/chat.py +5 -3
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +49 -41
- intentkit/core/draft.py +201 -0
- intentkit/core/draft_chat.py +118 -0
- intentkit/core/engine.py +378 -287
- intentkit/core/manager/__init__.py +25 -0
- intentkit/core/manager/engine.py +220 -0
- intentkit/core/manager/service.py +172 -0
- intentkit/core/manager/skills.py +178 -0
- intentkit/core/middleware.py +231 -0
- intentkit/core/prompt.py +74 -114
- intentkit/core/scheduler.py +143 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +931 -518
- intentkit/models/agent_data.py +165 -106
- intentkit/models/agent_schema.json +38 -251
- intentkit/models/app_setting.py +15 -13
- intentkit/models/chat.py +86 -140
- intentkit/models/credit.py +182 -162
- intentkit/models/db.py +42 -23
- intentkit/models/db_mig.py +120 -3
- intentkit/models/draft.py +222 -0
- intentkit/models/llm.csv +31 -0
- intentkit/models/llm.py +262 -370
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +222 -101
- intentkit/models/skills.csv +173 -0
- intentkit/models/team.py +189 -0
- intentkit/models/user.py +103 -31
- 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 +241 -41
- 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 +6 -6
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/casino/schema.json +0 -1
- 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 +10 -24
- 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 +8 -19
- 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/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -93
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- 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 +54 -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/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- 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 +2 -6
- intentkit/skills/firecrawl/scrape.py +17 -22
- 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 +13 -15
- intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
- intentkit/skills/heurist/image_generation_braindance.py +13 -15
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
- intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
- intentkit/skills/heurist/image_generation_sdxl.py +13 -15
- 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 +3 -9
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +150 -60
- 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 +30 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +4 -9
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +5 -9
- intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
- intentkit/skills/openai/gpt_image_to_image.py +5 -9
- 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 +36 -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 +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- 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 +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +4 -12
- 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 +11 -10
- 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 +58 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +40 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +7 -6
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/__init__.py +4 -0
- intentkit/utils/chain.py +198 -96
- intentkit/utils/ens.py +135 -0
- intentkit/utils/error.py +5 -2
- intentkit/utils/logging.py +9 -11
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +8 -8
- intentkit/utils/tx.py +16 -8
- intentkit/uv.lock +3377 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
- intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
- intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
- intentkit/core/node.py +0 -215
- intentkit/models/conversation.py +0 -286
- 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.7.5.dev3.dist-info/RECORD +0 -424
- {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
intentkit/models/generator.py
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
"""Agent Generation Log Model.
|
|
2
|
-
|
|
3
|
-
This module defines the database models for logging agent generation operations,
|
|
4
|
-
including token usage, prompts, AI responses, and generation metadata.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from datetime import datetime, timezone
|
|
8
|
-
from typing import Annotated, Optional
|
|
9
|
-
|
|
10
|
-
from epyxid import XID
|
|
11
|
-
from intentkit.models.base import Base
|
|
12
|
-
from pydantic import BaseModel, ConfigDict, Field
|
|
13
|
-
from sqlalchemy import (
|
|
14
|
-
Boolean,
|
|
15
|
-
Column,
|
|
16
|
-
DateTime,
|
|
17
|
-
Integer,
|
|
18
|
-
String,
|
|
19
|
-
Text,
|
|
20
|
-
func,
|
|
21
|
-
select,
|
|
22
|
-
)
|
|
23
|
-
from sqlalchemy.dialects.postgresql import JSON, JSONB
|
|
24
|
-
from sqlalchemy.ext.asyncio import AsyncSession
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class AgentGenerationLogTable(Base):
|
|
28
|
-
"""Agent generation log database table model."""
|
|
29
|
-
|
|
30
|
-
__tablename__ = "agent_generation_logs"
|
|
31
|
-
|
|
32
|
-
id = Column(
|
|
33
|
-
String,
|
|
34
|
-
primary_key=True,
|
|
35
|
-
)
|
|
36
|
-
user_id = Column(
|
|
37
|
-
String,
|
|
38
|
-
nullable=True,
|
|
39
|
-
)
|
|
40
|
-
prompt = Column(
|
|
41
|
-
Text,
|
|
42
|
-
nullable=False,
|
|
43
|
-
)
|
|
44
|
-
existing_agent_id = Column(
|
|
45
|
-
String,
|
|
46
|
-
nullable=True,
|
|
47
|
-
)
|
|
48
|
-
is_update = Column(
|
|
49
|
-
Boolean,
|
|
50
|
-
default=False,
|
|
51
|
-
nullable=False,
|
|
52
|
-
)
|
|
53
|
-
generated_agent_schema = Column(
|
|
54
|
-
JSON().with_variant(JSONB(), "postgresql"),
|
|
55
|
-
nullable=True,
|
|
56
|
-
)
|
|
57
|
-
identified_skills = Column(
|
|
58
|
-
JSON().with_variant(JSONB(), "postgresql"),
|
|
59
|
-
nullable=True,
|
|
60
|
-
)
|
|
61
|
-
# LLM API response data
|
|
62
|
-
llm_model = Column(
|
|
63
|
-
String,
|
|
64
|
-
nullable=True,
|
|
65
|
-
)
|
|
66
|
-
total_tokens = Column(
|
|
67
|
-
Integer,
|
|
68
|
-
default=0,
|
|
69
|
-
)
|
|
70
|
-
input_tokens = Column(
|
|
71
|
-
Integer,
|
|
72
|
-
default=0,
|
|
73
|
-
)
|
|
74
|
-
cached_input_tokens = Column(
|
|
75
|
-
Integer,
|
|
76
|
-
default=0,
|
|
77
|
-
)
|
|
78
|
-
output_tokens = Column(
|
|
79
|
-
Integer,
|
|
80
|
-
default=0,
|
|
81
|
-
)
|
|
82
|
-
input_tokens_details = Column(
|
|
83
|
-
JSON().with_variant(JSONB(), "postgresql"),
|
|
84
|
-
nullable=True,
|
|
85
|
-
)
|
|
86
|
-
completion_tokens_details = Column(
|
|
87
|
-
JSON().with_variant(JSONB(), "postgresql"),
|
|
88
|
-
nullable=True,
|
|
89
|
-
)
|
|
90
|
-
# Performance metrics
|
|
91
|
-
generation_time_ms = Column(
|
|
92
|
-
Integer,
|
|
93
|
-
nullable=True,
|
|
94
|
-
)
|
|
95
|
-
retry_count = Column(
|
|
96
|
-
Integer,
|
|
97
|
-
default=0,
|
|
98
|
-
)
|
|
99
|
-
validation_errors = Column(
|
|
100
|
-
JSON().with_variant(JSONB(), "postgresql"),
|
|
101
|
-
nullable=True,
|
|
102
|
-
)
|
|
103
|
-
# Status and results
|
|
104
|
-
success = Column(
|
|
105
|
-
Boolean,
|
|
106
|
-
default=False,
|
|
107
|
-
nullable=False,
|
|
108
|
-
)
|
|
109
|
-
error_message = Column(
|
|
110
|
-
Text,
|
|
111
|
-
nullable=True,
|
|
112
|
-
)
|
|
113
|
-
# Timestamps
|
|
114
|
-
created_at = Column(
|
|
115
|
-
DateTime(timezone=True),
|
|
116
|
-
nullable=False,
|
|
117
|
-
server_default=func.now(),
|
|
118
|
-
)
|
|
119
|
-
completed_at = Column(
|
|
120
|
-
DateTime(timezone=True),
|
|
121
|
-
nullable=True,
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
class AgentGenerationLogCreate(BaseModel):
|
|
126
|
-
"""Model for creating agent generation log entries."""
|
|
127
|
-
|
|
128
|
-
model_config = ConfigDict(
|
|
129
|
-
use_enum_values=True,
|
|
130
|
-
from_attributes=True,
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
id: Annotated[
|
|
134
|
-
str,
|
|
135
|
-
Field(
|
|
136
|
-
default_factory=lambda: str(XID()),
|
|
137
|
-
description="Unique identifier for the generation log",
|
|
138
|
-
),
|
|
139
|
-
]
|
|
140
|
-
user_id: Optional[str] = Field(
|
|
141
|
-
None,
|
|
142
|
-
description="User ID who initiated the generation",
|
|
143
|
-
)
|
|
144
|
-
prompt: str = Field(
|
|
145
|
-
...,
|
|
146
|
-
description="The original prompt used for generation",
|
|
147
|
-
)
|
|
148
|
-
existing_agent_id: Optional[str] = Field(
|
|
149
|
-
None,
|
|
150
|
-
description="ID of existing agent if this is an update operation",
|
|
151
|
-
)
|
|
152
|
-
is_update: bool = Field(
|
|
153
|
-
False,
|
|
154
|
-
description="Whether this is an update to existing agent",
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
class AgentGenerationLog(BaseModel):
|
|
159
|
-
"""Agent generation log model."""
|
|
160
|
-
|
|
161
|
-
model_config = ConfigDict(
|
|
162
|
-
use_enum_values=True,
|
|
163
|
-
from_attributes=True,
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
id: str
|
|
167
|
-
user_id: Optional[str] = None
|
|
168
|
-
prompt: str
|
|
169
|
-
existing_agent_id: Optional[str] = None
|
|
170
|
-
is_update: bool = False
|
|
171
|
-
generated_agent_schema: Optional[dict] = None
|
|
172
|
-
identified_skills: Optional[dict] = None
|
|
173
|
-
llm_model: Optional[str] = None
|
|
174
|
-
total_tokens: int = 0
|
|
175
|
-
input_tokens: int = 0
|
|
176
|
-
cached_input_tokens: int = 0
|
|
177
|
-
output_tokens: int = 0
|
|
178
|
-
input_tokens_details: Optional[dict] = None
|
|
179
|
-
completion_tokens_details: Optional[dict] = None
|
|
180
|
-
generation_time_ms: Optional[int] = None
|
|
181
|
-
retry_count: int = 0
|
|
182
|
-
validation_errors: Optional[dict] = None
|
|
183
|
-
success: bool = False
|
|
184
|
-
error_message: Optional[str] = None
|
|
185
|
-
created_at: datetime
|
|
186
|
-
completed_at: Optional[datetime] = None
|
|
187
|
-
|
|
188
|
-
@classmethod
|
|
189
|
-
async def create(
|
|
190
|
-
cls,
|
|
191
|
-
session: AsyncSession,
|
|
192
|
-
log_data: AgentGenerationLogCreate,
|
|
193
|
-
) -> "AgentGenerationLog":
|
|
194
|
-
"""Create a new agent generation log entry.
|
|
195
|
-
|
|
196
|
-
Args:
|
|
197
|
-
session: Database session
|
|
198
|
-
log_data: Log data to create
|
|
199
|
-
|
|
200
|
-
Returns:
|
|
201
|
-
Created log instance
|
|
202
|
-
"""
|
|
203
|
-
# Create database record
|
|
204
|
-
log_record = AgentGenerationLogTable(
|
|
205
|
-
id=log_data.id,
|
|
206
|
-
user_id=log_data.user_id,
|
|
207
|
-
prompt=log_data.prompt,
|
|
208
|
-
existing_agent_id=log_data.existing_agent_id,
|
|
209
|
-
is_update=log_data.is_update,
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
session.add(log_record)
|
|
213
|
-
await session.commit()
|
|
214
|
-
await session.refresh(log_record)
|
|
215
|
-
|
|
216
|
-
return cls.model_validate(log_record)
|
|
217
|
-
|
|
218
|
-
async def update_completion(
|
|
219
|
-
self,
|
|
220
|
-
session: AsyncSession,
|
|
221
|
-
generated_agent_schema: Optional[dict] = None,
|
|
222
|
-
identified_skills: Optional[dict] = None,
|
|
223
|
-
llm_model: Optional[str] = None,
|
|
224
|
-
total_tokens: int = 0,
|
|
225
|
-
input_tokens: int = 0,
|
|
226
|
-
cached_input_tokens: int = 0,
|
|
227
|
-
output_tokens: int = 0,
|
|
228
|
-
input_tokens_details: Optional[dict] = None,
|
|
229
|
-
completion_tokens_details: Optional[dict] = None,
|
|
230
|
-
generation_time_ms: Optional[int] = None,
|
|
231
|
-
retry_count: int = 0,
|
|
232
|
-
validation_errors: Optional[dict] = None,
|
|
233
|
-
success: bool = False,
|
|
234
|
-
error_message: Optional[str] = None,
|
|
235
|
-
) -> None:
|
|
236
|
-
"""Update the log entry with completion data.
|
|
237
|
-
|
|
238
|
-
Args:
|
|
239
|
-
session: Database session
|
|
240
|
-
generated_agent_schema: The generated agent schema
|
|
241
|
-
identified_skills: Skills identified during generation
|
|
242
|
-
llm_model: LLM model used
|
|
243
|
-
total_tokens: Total tokens used
|
|
244
|
-
input_tokens: Input tokens used
|
|
245
|
-
cached_input_tokens: Cached input tokens used (for cost calculation)
|
|
246
|
-
output_tokens: Output tokens used
|
|
247
|
-
input_tokens_details: Detailed input token breakdown
|
|
248
|
-
completion_tokens_details: Detailed completion token breakdown
|
|
249
|
-
generation_time_ms: Generation time in milliseconds
|
|
250
|
-
retry_count: Number of retries attempted
|
|
251
|
-
validation_errors: Any validation errors encountered
|
|
252
|
-
success: Whether generation was successful
|
|
253
|
-
error_message: Error message if generation failed
|
|
254
|
-
"""
|
|
255
|
-
# Get the database record
|
|
256
|
-
log_record = await session.get(AgentGenerationLogTable, self.id)
|
|
257
|
-
if not log_record:
|
|
258
|
-
return
|
|
259
|
-
|
|
260
|
-
# Update fields
|
|
261
|
-
log_record.generated_agent_schema = generated_agent_schema
|
|
262
|
-
log_record.identified_skills = identified_skills
|
|
263
|
-
log_record.llm_model = llm_model
|
|
264
|
-
log_record.total_tokens = total_tokens
|
|
265
|
-
log_record.input_tokens = input_tokens
|
|
266
|
-
log_record.cached_input_tokens = cached_input_tokens
|
|
267
|
-
log_record.output_tokens = output_tokens
|
|
268
|
-
log_record.input_tokens_details = input_tokens_details
|
|
269
|
-
log_record.completion_tokens_details = completion_tokens_details
|
|
270
|
-
log_record.generation_time_ms = generation_time_ms
|
|
271
|
-
log_record.retry_count = retry_count
|
|
272
|
-
log_record.validation_errors = validation_errors
|
|
273
|
-
log_record.success = success
|
|
274
|
-
log_record.error_message = error_message
|
|
275
|
-
log_record.completed_at = datetime.now(timezone.utc)
|
|
276
|
-
|
|
277
|
-
session.add(log_record)
|
|
278
|
-
await session.commit()
|
|
279
|
-
await session.refresh(log_record)
|
|
280
|
-
|
|
281
|
-
# Update this instance
|
|
282
|
-
self.generated_agent_schema = log_record.generated_agent_schema
|
|
283
|
-
self.identified_skills = log_record.identified_skills
|
|
284
|
-
self.llm_model = log_record.llm_model
|
|
285
|
-
self.total_tokens = log_record.total_tokens
|
|
286
|
-
self.input_tokens = log_record.input_tokens
|
|
287
|
-
self.cached_input_tokens = log_record.cached_input_tokens
|
|
288
|
-
self.output_tokens = log_record.output_tokens
|
|
289
|
-
self.input_tokens_details = log_record.input_tokens_details
|
|
290
|
-
self.completion_tokens_details = log_record.completion_tokens_details
|
|
291
|
-
self.generation_time_ms = log_record.generation_time_ms
|
|
292
|
-
self.retry_count = log_record.retry_count
|
|
293
|
-
self.validation_errors = log_record.validation_errors
|
|
294
|
-
self.success = log_record.success
|
|
295
|
-
self.error_message = log_record.error_message
|
|
296
|
-
self.completed_at = log_record.completed_at
|
|
297
|
-
|
|
298
|
-
@classmethod
|
|
299
|
-
async def get_by_id(
|
|
300
|
-
cls,
|
|
301
|
-
session: AsyncSession,
|
|
302
|
-
log_id: str,
|
|
303
|
-
) -> Optional["AgentGenerationLog"]:
|
|
304
|
-
"""Get an agent generation log by ID.
|
|
305
|
-
|
|
306
|
-
Args:
|
|
307
|
-
session: Database session
|
|
308
|
-
log_id: Log ID
|
|
309
|
-
|
|
310
|
-
Returns:
|
|
311
|
-
Log instance if found, None otherwise
|
|
312
|
-
"""
|
|
313
|
-
result = await session.execute(
|
|
314
|
-
select(AgentGenerationLogTable).where(AgentGenerationLogTable.id == log_id)
|
|
315
|
-
)
|
|
316
|
-
log_record = result.scalar_one_or_none()
|
|
317
|
-
|
|
318
|
-
if log_record:
|
|
319
|
-
return cls.model_validate(log_record)
|
|
320
|
-
return None
|
|
321
|
-
|
|
322
|
-
@classmethod
|
|
323
|
-
async def get_by_user(
|
|
324
|
-
cls,
|
|
325
|
-
session: AsyncSession,
|
|
326
|
-
user_id: str,
|
|
327
|
-
limit: int = 50,
|
|
328
|
-
) -> list["AgentGenerationLog"]:
|
|
329
|
-
"""Get agent generation logs for a user.
|
|
330
|
-
|
|
331
|
-
Args:
|
|
332
|
-
session: Database session
|
|
333
|
-
user_id: User ID
|
|
334
|
-
limit: Maximum number of logs to return
|
|
335
|
-
|
|
336
|
-
Returns:
|
|
337
|
-
List of log instances
|
|
338
|
-
"""
|
|
339
|
-
result = await session.execute(
|
|
340
|
-
select(AgentGenerationLogTable)
|
|
341
|
-
.where(AgentGenerationLogTable.user_id == user_id)
|
|
342
|
-
.order_by(AgentGenerationLogTable.created_at.desc())
|
|
343
|
-
.limit(limit)
|
|
344
|
-
)
|
|
345
|
-
log_records = result.scalars().all()
|
|
346
|
-
|
|
347
|
-
return [cls.model_validate(record) for record in log_records]
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
from typing import Optional, Type
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, Field
|
|
4
|
-
|
|
5
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
6
|
-
from intentkit.clients import get_cdp_client
|
|
7
|
-
from intentkit.skills.cdp.base import CDPBaseTool
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class GetBalanceInput(BaseModel):
|
|
11
|
-
"""Input for GetBalance tool."""
|
|
12
|
-
|
|
13
|
-
asset_id: Optional[str] = Field(
|
|
14
|
-
default=None,
|
|
15
|
-
description="The asset ID to get the balance for (e.g., 'eth', 'usdc', or a valid contract address). If not provided, returns all token balances.",
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class GetBalance(CDPBaseTool):
|
|
20
|
-
"""Tool for getting balance from CDP wallet.
|
|
21
|
-
|
|
22
|
-
This tool uses the CDP API to get balance for all addresses in a wallet for a given asset.
|
|
23
|
-
|
|
24
|
-
Attributes:
|
|
25
|
-
name: The name of the tool.
|
|
26
|
-
description: A description of what the tool does.
|
|
27
|
-
args_schema: The schema for the tool's input arguments.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
agent_id: str
|
|
31
|
-
skill_store: SkillStoreABC
|
|
32
|
-
|
|
33
|
-
name: str = "cdp_get_balance"
|
|
34
|
-
description: str = (
|
|
35
|
-
"This tool will get the balance of all the addresses in the wallet. If asset_id is provided, it returns the balance for that specific asset. "
|
|
36
|
-
"If no asset_id is provided, it returns all token balances. "
|
|
37
|
-
"Always use 'eth' for the native asset ETH and 'usdc' for USDC. "
|
|
38
|
-
"Other valid asset IDs are: weth,dai,reth,brett,w,cbeth,axl,iotx,prime,aero,rsr,mog,tbtc,npc,yfi"
|
|
39
|
-
)
|
|
40
|
-
args_schema: Type[BaseModel] = GetBalanceInput
|
|
41
|
-
|
|
42
|
-
async def _arun(self, asset_id: Optional[str] = None) -> str:
|
|
43
|
-
"""Async implementation of the tool to get balance.
|
|
44
|
-
|
|
45
|
-
Args:
|
|
46
|
-
asset_id (Optional[str]): The asset ID to get the balance for. If None, returns all token balances.
|
|
47
|
-
|
|
48
|
-
Returns:
|
|
49
|
-
str: A message containing the balance information or error message.
|
|
50
|
-
"""
|
|
51
|
-
# Get network information from CDP client
|
|
52
|
-
cdp_client = await get_cdp_client(self.agent_id, self.skill_store)
|
|
53
|
-
provider = await cdp_client.get_wallet_provider()
|
|
54
|
-
provider_config = await cdp_client.get_provider_config()
|
|
55
|
-
network_id = provider_config.network_id
|
|
56
|
-
|
|
57
|
-
# Map network_id to the format expected by the API
|
|
58
|
-
network_mapping = {
|
|
59
|
-
"base-mainnet": "base",
|
|
60
|
-
"ethereum-mainnet": "ethereum",
|
|
61
|
-
}
|
|
62
|
-
api_network = network_mapping.get(network_id, network_id)
|
|
63
|
-
|
|
64
|
-
# For native ETH balance, use the account's balance directly
|
|
65
|
-
if asset_id and asset_id.lower() == "eth":
|
|
66
|
-
try:
|
|
67
|
-
# Get native balance using Web3
|
|
68
|
-
balance_wei = provider.get_balance()
|
|
69
|
-
balance_eth = balance_wei / (10**18) # Convert from wei to ETH
|
|
70
|
-
return f"ETH balance: {balance_eth} ETH"
|
|
71
|
-
except Exception as e:
|
|
72
|
-
return f"Error getting ETH balance: {e!s}"
|
|
73
|
-
|
|
74
|
-
client = provider.get_client()
|
|
75
|
-
async with client:
|
|
76
|
-
account = await client.evm.get_account(provider.get_address())
|
|
77
|
-
# If no asset_id provided, return all token balances
|
|
78
|
-
if asset_id is None:
|
|
79
|
-
# Get native ETH balance
|
|
80
|
-
balance_wei = provider.get_balance()
|
|
81
|
-
balance_eth = balance_wei / (10**18) # Convert from wei to ETH
|
|
82
|
-
|
|
83
|
-
# Get all token balances
|
|
84
|
-
token_balances = await account.list_token_balances(api_network)
|
|
85
|
-
|
|
86
|
-
result = [f"ETH balance: {balance_eth} ETH"]
|
|
87
|
-
|
|
88
|
-
for balance in token_balances.balances:
|
|
89
|
-
result.append(
|
|
90
|
-
f"{balance.token.symbol} balance: {balance.amount.decimals} {balance.token.name}"
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
return f"All balances for account {account.address}:\n" + "\n".join(
|
|
94
|
-
result
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
# For other tokens, try the list_token_balances API
|
|
98
|
-
token_balances = await account.list_token_balances(api_network)
|
|
99
|
-
|
|
100
|
-
# Find the balance for the specific asset
|
|
101
|
-
target_balance = None
|
|
102
|
-
for balance in token_balances.balances:
|
|
103
|
-
if balance.token.symbol.lower() == asset_id.lower():
|
|
104
|
-
target_balance = balance
|
|
105
|
-
break
|
|
106
|
-
|
|
107
|
-
if target_balance:
|
|
108
|
-
return f"Balance for {asset_id} in account {account.address}: {target_balance.amount.decimals} {target_balance.token.name}"
|
|
109
|
-
else:
|
|
110
|
-
return f"No balance found for asset {asset_id} in account {account.address}"
|
intentkit/skills/cdp/swap.py
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
from typing import Optional, Type, Union
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel, Field
|
|
4
|
-
|
|
5
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
6
|
-
from intentkit.clients import get_cdp_client
|
|
7
|
-
from intentkit.skills.cdp.base import CDPBaseTool
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class SwapInput(BaseModel):
|
|
11
|
-
"""Input for Swap tool."""
|
|
12
|
-
|
|
13
|
-
from_token: str = Field(
|
|
14
|
-
description="The contract address of the token to swap from (e.g., '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' for USDC on Base)"
|
|
15
|
-
)
|
|
16
|
-
to_token: str = Field(
|
|
17
|
-
description="The contract address of the token to swap to (e.g., '0x4200000000000000000000000000000000000006' for WETH on Base)"
|
|
18
|
-
)
|
|
19
|
-
from_amount: Union[str, int] = Field(
|
|
20
|
-
description="The amount to swap from in smallest unit (e.g., 1000000 for 1 USDC with 6 decimals)"
|
|
21
|
-
)
|
|
22
|
-
slippage_bps: Optional[int] = Field(
|
|
23
|
-
default=100,
|
|
24
|
-
description="Maximum slippage in basis points (100 = 1%). Defaults to 100 (1%)",
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class Swap(CDPBaseTool):
|
|
29
|
-
"""Tool for swapping tokens using CDP wallet.
|
|
30
|
-
|
|
31
|
-
This tool uses the CDP API to execute token swaps on supported networks.
|
|
32
|
-
It wraps the swap functionality from the EVM account.
|
|
33
|
-
|
|
34
|
-
Attributes:
|
|
35
|
-
name: The name of the tool.
|
|
36
|
-
description: A description of what the tool does.
|
|
37
|
-
args_schema: The schema for the tool's input arguments.
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
agent_id: str
|
|
41
|
-
skill_store: SkillStoreABC
|
|
42
|
-
|
|
43
|
-
name: str = "cdp_swap"
|
|
44
|
-
description: str = (
|
|
45
|
-
"This tool will swap tokens using the CDP wallet. "
|
|
46
|
-
"It supports swapping between any ERC-20 tokens on supported networks (Base and Ethereum). "
|
|
47
|
-
"You need to provide the contract addresses of both tokens and the amount to swap. "
|
|
48
|
-
"The amount should be in the smallest unit of the token (e.g., wei for ETH, or atomic units for ERC-20 tokens). "
|
|
49
|
-
"Common token addresses on Base: USDC=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, WETH=0x4200000000000000000000000000000000000006. "
|
|
50
|
-
"The tool will automatically handle gas estimation and transaction submission."
|
|
51
|
-
)
|
|
52
|
-
args_schema: Type[BaseModel] = SwapInput
|
|
53
|
-
|
|
54
|
-
async def _arun(
|
|
55
|
-
self,
|
|
56
|
-
from_token: str,
|
|
57
|
-
to_token: str,
|
|
58
|
-
from_amount: Union[str, int],
|
|
59
|
-
slippage_bps: Optional[int] = 100,
|
|
60
|
-
) -> str:
|
|
61
|
-
"""Async implementation of the tool to swap tokens.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
from_token (str): The contract address of the token to swap from.
|
|
65
|
-
to_token (str): The contract address of the token to swap to.
|
|
66
|
-
from_amount (Union[str, int]): The amount to swap from in smallest unit.
|
|
67
|
-
slippage_bps (Optional[int]): Maximum slippage in basis points. Defaults to 100 (1%).
|
|
68
|
-
|
|
69
|
-
Returns:
|
|
70
|
-
str: A message containing the swap result or error message.
|
|
71
|
-
"""
|
|
72
|
-
try:
|
|
73
|
-
# Get CDP client and network information
|
|
74
|
-
cdp_client = await get_cdp_client(self.agent_id, self.skill_store)
|
|
75
|
-
provider = await cdp_client.get_wallet_provider()
|
|
76
|
-
provider_config = await cdp_client.get_provider_config()
|
|
77
|
-
network_id = provider_config.network_id
|
|
78
|
-
|
|
79
|
-
# Map network_id to the format expected by the swap API
|
|
80
|
-
network_mapping = {
|
|
81
|
-
"base-mainnet": "base",
|
|
82
|
-
"ethereum-mainnet": "ethereum",
|
|
83
|
-
}
|
|
84
|
-
api_network = network_mapping.get(network_id, network_id)
|
|
85
|
-
|
|
86
|
-
# Validate network is supported
|
|
87
|
-
supported_networks = ["base", "ethereum"]
|
|
88
|
-
if api_network not in supported_networks:
|
|
89
|
-
return f"Error: Network {api_network} is not supported for swaps. Supported networks: {', '.join(supported_networks)}"
|
|
90
|
-
|
|
91
|
-
# Get the EVM account
|
|
92
|
-
client = provider.get_client()
|
|
93
|
-
async with client:
|
|
94
|
-
account = await client.evm.get_account(provider.get_address())
|
|
95
|
-
|
|
96
|
-
# Import AccountSwapOptions here to avoid circular imports
|
|
97
|
-
from cdp.actions.evm.swap.types import AccountSwapOptions
|
|
98
|
-
|
|
99
|
-
# Create swap options
|
|
100
|
-
swap_options = AccountSwapOptions(
|
|
101
|
-
network=api_network,
|
|
102
|
-
from_token=from_token,
|
|
103
|
-
to_token=to_token,
|
|
104
|
-
from_amount=str(from_amount),
|
|
105
|
-
slippage_bps=slippage_bps,
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
# Execute the swap
|
|
109
|
-
result = await account.swap(swap_options)
|
|
110
|
-
|
|
111
|
-
return (
|
|
112
|
-
f"Swap executed successfully!\n"
|
|
113
|
-
f"Transaction hash: {result.transaction_hash}\n"
|
|
114
|
-
f"Swapped from {from_token} to {to_token}\n"
|
|
115
|
-
f"Amount: {from_amount} (smallest units)\n"
|
|
116
|
-
f"Network: {api_network}\n"
|
|
117
|
-
f"Slippage tolerance: {slippage_bps} basis points ({slippage_bps / 100 if slippage_bps else 0}%)"
|
|
118
|
-
)
|
|
119
|
-
|
|
120
|
-
except Exception as e:
|
|
121
|
-
return f"Error executing swap: {e!s}"
|
|
File without changes
|