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,7 +1,6 @@
|
|
|
1
1
|
"""fetching wallet portfolio for a specific blockchain."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Optional, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -27,7 +26,7 @@ class ChainTokenBalance(BaseModel):
|
|
|
27
26
|
contract_address: str = Field(..., description="Token contract address")
|
|
28
27
|
symbol: str = Field(..., description="Token symbol")
|
|
29
28
|
name: str = Field(..., description="Token name")
|
|
30
|
-
logo:
|
|
29
|
+
logo: str | None = Field(None, description="Token logo URL")
|
|
31
30
|
decimals: int = Field(..., description="Token decimals")
|
|
32
31
|
balance: float = Field(..., description="Token balance")
|
|
33
32
|
balance_raw: str = Field(..., description="Raw token balance")
|
|
@@ -38,12 +37,12 @@ class TokenApproval(BaseModel):
|
|
|
38
37
|
"""Model for token approval."""
|
|
39
38
|
|
|
40
39
|
token_address: str = Field(..., description="Token contract address")
|
|
41
|
-
token_symbol:
|
|
42
|
-
token_name:
|
|
40
|
+
token_symbol: str | None = Field(None, description="Token symbol")
|
|
41
|
+
token_name: str | None = Field(None, description="Token name")
|
|
43
42
|
spender: str = Field(..., description="Spender address (contract)")
|
|
44
|
-
spender_name:
|
|
43
|
+
spender_name: str | None = Field(None, description="Spender name if known")
|
|
45
44
|
allowance: str = Field(..., description="Raw approval amount")
|
|
46
|
-
allowance_formatted:
|
|
45
|
+
allowance_formatted: float | None = Field(
|
|
47
46
|
None, description="Formatted approval amount"
|
|
48
47
|
)
|
|
49
48
|
unlimited: bool = Field(False, description="Whether the approval is unlimited")
|
|
@@ -55,17 +54,17 @@ class ChainPortfolioOutput(BaseModel):
|
|
|
55
54
|
address: str = Field(..., description="Wallet address")
|
|
56
55
|
chain_id: int = Field(..., description="Chain ID")
|
|
57
56
|
chain_name: str = Field(..., description="Chain name")
|
|
58
|
-
native_token:
|
|
57
|
+
native_token: ChainTokenBalance | None = Field(
|
|
59
58
|
None, description="Native token balance"
|
|
60
59
|
)
|
|
61
|
-
tokens:
|
|
60
|
+
tokens: list[ChainTokenBalance] = Field(
|
|
62
61
|
default_factory=list, description="List of token balances"
|
|
63
62
|
)
|
|
64
63
|
total_usd_value: float = Field(0.0, description="Total USD value on this chain")
|
|
65
|
-
approvals:
|
|
64
|
+
approvals: list[TokenApproval] | None = Field(
|
|
66
65
|
None, description="Token approvals if requested"
|
|
67
66
|
)
|
|
68
|
-
error:
|
|
67
|
+
error: str | None = Field(None, description="Error message if any")
|
|
69
68
|
|
|
70
69
|
|
|
71
70
|
class FetchChainPortfolio(WalletBaseTool):
|
|
@@ -87,7 +86,7 @@ class FetchChainPortfolio(WalletBaseTool):
|
|
|
87
86
|
"- Token approvals (optional)\n"
|
|
88
87
|
"Use this tool whenever a user wants to see their holdings on a specific blockchain."
|
|
89
88
|
)
|
|
90
|
-
args_schema:
|
|
89
|
+
args_schema: type[BaseModel] = FetchChainPortfolioInput
|
|
91
90
|
|
|
92
91
|
async def _arun(
|
|
93
92
|
self, address: str, chain_id: int, include_approvals: bool = False, **kwargs
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
@@ -16,7 +16,7 @@ class FetchNftPortfolioInput(BaseModel):
|
|
|
16
16
|
"""Input for FetchNftPortfolio tool."""
|
|
17
17
|
|
|
18
18
|
address: str = Field(..., description="Wallet address")
|
|
19
|
-
chain_id:
|
|
19
|
+
chain_id: int | None = Field(
|
|
20
20
|
None,
|
|
21
21
|
description="Chain ID (if not specified, fetches from all supported chains)",
|
|
22
22
|
)
|
|
@@ -26,7 +26,7 @@ class FetchNftPortfolioInput(BaseModel):
|
|
|
26
26
|
solana_network: str = Field(
|
|
27
27
|
default="mainnet", description="Solana network to use (mainnet or devnet)"
|
|
28
28
|
)
|
|
29
|
-
limit:
|
|
29
|
+
limit: int | None = Field(100, description="Maximum number of NFTs to return")
|
|
30
30
|
normalize_metadata: bool = Field(
|
|
31
31
|
True, description="Whether to normalize metadata across different standards"
|
|
32
32
|
)
|
|
@@ -35,12 +35,12 @@ class FetchNftPortfolioInput(BaseModel):
|
|
|
35
35
|
class NftMetadata(BaseModel):
|
|
36
36
|
"""Model for NFT metadata."""
|
|
37
37
|
|
|
38
|
-
name:
|
|
39
|
-
description:
|
|
40
|
-
image:
|
|
41
|
-
animation_url:
|
|
42
|
-
attributes:
|
|
43
|
-
external_url:
|
|
38
|
+
name: str | None = Field(None, description="NFT name")
|
|
39
|
+
description: str | None = Field(None, description="NFT description")
|
|
40
|
+
image: str | None = Field(None, description="NFT image URL")
|
|
41
|
+
animation_url: str | None = Field(None, description="NFT animation URL")
|
|
42
|
+
attributes: list[dict] | None = Field(None, description="NFT attributes/traits")
|
|
43
|
+
external_url: str | None = Field(None, description="External URL")
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
class NftItem(BaseModel):
|
|
@@ -48,14 +48,14 @@ class NftItem(BaseModel):
|
|
|
48
48
|
|
|
49
49
|
token_id: str = Field(..., description="NFT token ID")
|
|
50
50
|
token_address: str = Field(..., description="NFT contract address")
|
|
51
|
-
contract_type:
|
|
51
|
+
contract_type: str | None = Field(
|
|
52
52
|
None, description="NFT contract type (ERC721, ERC1155, etc.)"
|
|
53
53
|
)
|
|
54
|
-
name:
|
|
55
|
-
symbol:
|
|
54
|
+
name: str | None = Field(None, description="NFT name")
|
|
55
|
+
symbol: str | None = Field(None, description="NFT symbol")
|
|
56
56
|
owner_of: str = Field(..., description="Owner address")
|
|
57
|
-
metadata:
|
|
58
|
-
floor_price:
|
|
57
|
+
metadata: NftMetadata | None = Field(None, description="NFT metadata")
|
|
58
|
+
floor_price: float | None = Field(None, description="Floor price if available")
|
|
59
59
|
chain: str = Field("eth", description="Blockchain network")
|
|
60
60
|
|
|
61
61
|
|
|
@@ -63,13 +63,13 @@ class NftPortfolioOutput(BaseModel):
|
|
|
63
63
|
"""Output for FetchNftPortfolio tool."""
|
|
64
64
|
|
|
65
65
|
address: str = Field(..., description="Wallet address")
|
|
66
|
-
nfts:
|
|
66
|
+
nfts: list[NftItem] = Field(default_factory=list, description="List of NFT items")
|
|
67
67
|
total_count: int = Field(0, description="Total count of NFTs")
|
|
68
|
-
chains:
|
|
68
|
+
chains: list[str] = Field(
|
|
69
69
|
default_factory=list, description="Chains included in the response"
|
|
70
70
|
)
|
|
71
|
-
cursor:
|
|
72
|
-
error:
|
|
71
|
+
cursor: str | None = Field(None, description="Cursor for pagination")
|
|
72
|
+
error: str | None = Field(None, description="Error message if any")
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
class FetchNftPortfolio(WalletBaseTool):
|
|
@@ -90,12 +90,12 @@ class FetchNftPortfolio(WalletBaseTool):
|
|
|
90
90
|
"- Floor prices if available\n"
|
|
91
91
|
"Use this tool whenever a user asks about their NFTs or digital collectibles."
|
|
92
92
|
)
|
|
93
|
-
args_schema:
|
|
93
|
+
args_schema: type[BaseModel] = FetchNftPortfolioInput
|
|
94
94
|
|
|
95
95
|
async def _arun(
|
|
96
96
|
self,
|
|
97
97
|
address: str,
|
|
98
|
-
chain_id:
|
|
98
|
+
chain_id: int | None = None,
|
|
99
99
|
include_solana: bool = False,
|
|
100
100
|
solana_network: str = "mainnet",
|
|
101
101
|
limit: int = 100,
|
|
@@ -156,7 +156,7 @@ class FetchNftPortfolio(WalletBaseTool):
|
|
|
156
156
|
chain_id: int,
|
|
157
157
|
limit: int,
|
|
158
158
|
normalize_metadata: bool,
|
|
159
|
-
result:
|
|
159
|
+
result: dict[str, Any],
|
|
160
160
|
) -> None:
|
|
161
161
|
"""Fetch NFTs from an EVM chain.
|
|
162
162
|
|
|
@@ -222,7 +222,7 @@ class FetchNftPortfolio(WalletBaseTool):
|
|
|
222
222
|
result["nfts"].append(nft_item)
|
|
223
223
|
|
|
224
224
|
async def _fetch_solana_nfts(
|
|
225
|
-
self, address: str, network: str, limit: int, result:
|
|
225
|
+
self, address: str, network: str, limit: int, result: dict[str, Any]
|
|
226
226
|
) -> None:
|
|
227
227
|
"""Fetch NFTs from Solana.
|
|
228
228
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""fetching Solana wallet portfolio."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Dict, List, Optional, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -48,17 +47,17 @@ class SolanaTokenBalance(BaseModel):
|
|
|
48
47
|
token_info: SolanaTokenInfo
|
|
49
48
|
amount: float
|
|
50
49
|
amount_raw: str
|
|
51
|
-
usd_value:
|
|
50
|
+
usd_value: float | None = 0.0
|
|
52
51
|
|
|
53
52
|
|
|
54
53
|
class SolanaNftInfo(BaseModel):
|
|
55
54
|
"""Model for Solana NFT information."""
|
|
56
55
|
|
|
57
56
|
mint: str
|
|
58
|
-
name:
|
|
59
|
-
symbol:
|
|
57
|
+
name: str | None = None
|
|
58
|
+
symbol: str | None = None
|
|
60
59
|
associated_token_address: str
|
|
61
|
-
metadata:
|
|
60
|
+
metadata: dict | None = None
|
|
62
61
|
|
|
63
62
|
|
|
64
63
|
class SolanaPortfolioOutput(BaseModel):
|
|
@@ -67,12 +66,12 @@ class SolanaPortfolioOutput(BaseModel):
|
|
|
67
66
|
address: str
|
|
68
67
|
sol_balance: float
|
|
69
68
|
sol_balance_lamports: int
|
|
70
|
-
sol_price_usd:
|
|
71
|
-
sol_value_usd:
|
|
72
|
-
tokens:
|
|
73
|
-
nfts:
|
|
69
|
+
sol_price_usd: float | None = None
|
|
70
|
+
sol_value_usd: float | None = None
|
|
71
|
+
tokens: list[SolanaTokenBalance] = []
|
|
72
|
+
nfts: list[SolanaNftInfo] = []
|
|
74
73
|
total_value_usd: float = 0.0
|
|
75
|
-
error:
|
|
74
|
+
error: str | None = None
|
|
76
75
|
|
|
77
76
|
|
|
78
77
|
class FetchSolanaPortfolio(WalletBaseTool):
|
|
@@ -91,7 +90,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
|
|
|
91
90
|
"- USD values of assets\n"
|
|
92
91
|
"Use this tool whenever the user asks specifically about Solana holdings."
|
|
93
92
|
)
|
|
94
|
-
args_schema:
|
|
93
|
+
args_schema: type[BaseModel] = SolanaPortfolioInput
|
|
95
94
|
|
|
96
95
|
async def _arun(
|
|
97
96
|
self,
|
|
@@ -136,7 +135,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
|
|
|
136
135
|
self,
|
|
137
136
|
address: str,
|
|
138
137
|
network: str,
|
|
139
|
-
sol_portfolio:
|
|
138
|
+
sol_portfolio: dict,
|
|
140
139
|
include_nfts: bool,
|
|
141
140
|
include_price_data: bool,
|
|
142
141
|
) -> SolanaPortfolioOutput:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""fetching a complete wallet portfolio (EVM + Solana)."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Dict, List, Optional, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -24,7 +23,7 @@ class FetchWalletPortfolioInput(BaseModel):
|
|
|
24
23
|
address: str = Field(
|
|
25
24
|
..., description="Wallet address to analyze (Ethereum or Solana)"
|
|
26
25
|
)
|
|
27
|
-
chains:
|
|
26
|
+
chains: list[int] | None = Field(
|
|
28
27
|
default=None,
|
|
29
28
|
description="List of EVM chain IDs to check (default: all supported)",
|
|
30
29
|
)
|
|
@@ -51,9 +50,9 @@ class PortfolioOutput(BaseModel):
|
|
|
51
50
|
|
|
52
51
|
address: str
|
|
53
52
|
total_net_worth: float
|
|
54
|
-
chains:
|
|
55
|
-
tokens:
|
|
56
|
-
error:
|
|
53
|
+
chains: dict[str, float]
|
|
54
|
+
tokens: list[TokenBalance]
|
|
55
|
+
error: str | None = None
|
|
57
56
|
|
|
58
57
|
|
|
59
58
|
class FetchWalletPortfolio(WalletBaseTool):
|
|
@@ -73,12 +72,12 @@ class FetchWalletPortfolio(WalletBaseTool):
|
|
|
73
72
|
"Use this tool whenever the user asks about their crypto holdings, portfolio value, "
|
|
74
73
|
"or wallet contents across multiple blockchains."
|
|
75
74
|
)
|
|
76
|
-
args_schema:
|
|
75
|
+
args_schema: type[BaseModel] = FetchWalletPortfolioInput
|
|
77
76
|
|
|
78
77
|
async def _arun(
|
|
79
78
|
self,
|
|
80
79
|
address: str,
|
|
81
|
-
chains:
|
|
80
|
+
chains: list[int] | None = None,
|
|
82
81
|
include_solana: bool = True,
|
|
83
82
|
solana_network: str = "mainnet",
|
|
84
83
|
**kwargs,
|
|
@@ -119,7 +118,7 @@ class FetchWalletPortfolio(WalletBaseTool):
|
|
|
119
118
|
)
|
|
120
119
|
|
|
121
120
|
async def _fetch_evm_portfolio(
|
|
122
|
-
self, address: str, chains:
|
|
121
|
+
self, address: str, chains: list[int] | None, portfolio: dict
|
|
123
122
|
) -> None:
|
|
124
123
|
"""Fetch portfolio data for EVM chains.
|
|
125
124
|
|
|
@@ -165,7 +164,7 @@ class FetchWalletPortfolio(WalletBaseTool):
|
|
|
165
164
|
)
|
|
166
165
|
|
|
167
166
|
async def _fetch_solana_portfolio(
|
|
168
|
-
self, address: str, network: str, portfolio:
|
|
167
|
+
self, address: str, network: str, portfolio: dict
|
|
169
168
|
) -> None:
|
|
170
169
|
"""Fetch portfolio data for Solana.
|
|
171
170
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Morpho AgentKit skills."""
|
|
2
|
+
|
|
3
|
+
from typing import TypedDict
|
|
4
|
+
|
|
5
|
+
from coinbase_agentkit import morpho_action_provider
|
|
6
|
+
|
|
7
|
+
from intentkit.models.agent import Agent
|
|
8
|
+
from intentkit.skills.base import (
|
|
9
|
+
SkillConfig,
|
|
10
|
+
SkillState,
|
|
11
|
+
action_to_structured_tool,
|
|
12
|
+
get_agentkit_actions,
|
|
13
|
+
)
|
|
14
|
+
from intentkit.skills.morpho.base import MorphoBaseTool
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SkillStates(TypedDict):
|
|
18
|
+
MorphoActionProvider_deposit: SkillState
|
|
19
|
+
MorphoActionProvider_withdraw: SkillState
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Config(SkillConfig):
|
|
23
|
+
"""Configuration for Morpho skills."""
|
|
24
|
+
|
|
25
|
+
states: SkillStates
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def get_skills(
|
|
29
|
+
config: Config,
|
|
30
|
+
is_private: bool,
|
|
31
|
+
agent_id: str,
|
|
32
|
+
agent: Agent | None = None,
|
|
33
|
+
**_,
|
|
34
|
+
) -> list[MorphoBaseTool]:
|
|
35
|
+
"""Get all Morpho skills."""
|
|
36
|
+
|
|
37
|
+
available_skills: list[str] = []
|
|
38
|
+
for skill_name, state in config["states"].items():
|
|
39
|
+
if state == "disabled":
|
|
40
|
+
continue
|
|
41
|
+
if state == "public" or (state == "private" and is_private):
|
|
42
|
+
available_skills.append(skill_name)
|
|
43
|
+
|
|
44
|
+
actions = await get_agentkit_actions(
|
|
45
|
+
agent_id, [morpho_action_provider], agent=agent
|
|
46
|
+
)
|
|
47
|
+
tools: list[MorphoBaseTool] = []
|
|
48
|
+
for skill in available_skills:
|
|
49
|
+
for action in actions:
|
|
50
|
+
if action.name.endswith(skill):
|
|
51
|
+
tools.append(action_to_structured_tool(action))
|
|
52
|
+
return tools
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
|
2
|
+
<defs>
|
|
3
|
+
<radialGradient id="morpho" cx="50%" cy="50%" r="70%">
|
|
4
|
+
<stop offset="0%" stop-color="#82f3ff" />
|
|
5
|
+
<stop offset="100%" stop-color="#006064" />
|
|
6
|
+
</radialGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="128" height="128" fill="#004d40" rx="16" />
|
|
9
|
+
<circle cx="64" cy="48" r="28" fill="url(#morpho)" />
|
|
10
|
+
<rect x="36" y="72" width="56" height="20" rx="10" fill="#26a69a" />
|
|
11
|
+
<text x="50%" y="84%" font-family="Arial,Helvetica,sans-serif" font-size="18" fill="#e0f2f1" font-weight="600" text-anchor="middle">Morpho</text>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Morpho",
|
|
5
|
+
"description": "Morpho lending actions via Coinbase AgentKit",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/morpho/morpho.svg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"DeFi"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"enabled": {
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"title": "Enabled",
|
|
14
|
+
"description": "Whether this skill is enabled",
|
|
15
|
+
"default": false
|
|
16
|
+
},
|
|
17
|
+
"states": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"MorphoActionProvider_deposit": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"title": "Deposit",
|
|
23
|
+
"enum": [
|
|
24
|
+
"disabled",
|
|
25
|
+
"public",
|
|
26
|
+
"private"
|
|
27
|
+
],
|
|
28
|
+
"x-enum-title": [
|
|
29
|
+
"Disabled",
|
|
30
|
+
"Agent Owner + All Users",
|
|
31
|
+
"Agent Owner Only"
|
|
32
|
+
],
|
|
33
|
+
"description": "State for MorphoActionProvider_deposit",
|
|
34
|
+
"default": "disabled"
|
|
35
|
+
},
|
|
36
|
+
"MorphoActionProvider_withdraw": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"title": "Withdraw",
|
|
39
|
+
"enum": [
|
|
40
|
+
"disabled",
|
|
41
|
+
"public",
|
|
42
|
+
"private"
|
|
43
|
+
],
|
|
44
|
+
"x-enum-title": [
|
|
45
|
+
"Disabled",
|
|
46
|
+
"Agent Owner + All Users",
|
|
47
|
+
"Agent Owner Only"
|
|
48
|
+
],
|
|
49
|
+
"description": "State for MorphoActionProvider_withdraw",
|
|
50
|
+
"default": "disabled"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"description": "States for each Morpho skill (disabled, public, or private)"
|
|
54
|
+
},
|
|
55
|
+
"api_key_provider": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"title": "API Key Provider",
|
|
58
|
+
"description": "Who provides the API key",
|
|
59
|
+
"enum": [
|
|
60
|
+
"platform"
|
|
61
|
+
],
|
|
62
|
+
"x-enum-title": [
|
|
63
|
+
"Nation Hosted"
|
|
64
|
+
],
|
|
65
|
+
"default": "platform"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"required": [
|
|
69
|
+
"states",
|
|
70
|
+
"enabled"
|
|
71
|
+
],
|
|
72
|
+
"additionalProperties": true
|
|
73
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import TypedDict
|
|
3
3
|
|
|
4
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
5
4
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
6
5
|
from intentkit.skills.nation.base import NationBaseTool
|
|
7
6
|
from intentkit.skills.nation.nft_check import NftCheck
|
|
@@ -25,7 +24,6 @@ class Config(SkillConfig):
|
|
|
25
24
|
async def get_skills(
|
|
26
25
|
config: "Config",
|
|
27
26
|
is_private: bool,
|
|
28
|
-
store: SkillStoreABC,
|
|
29
27
|
**_,
|
|
30
28
|
) -> list[NationBaseTool]:
|
|
31
29
|
"""Get all nation skills."""
|
|
@@ -42,20 +40,17 @@ async def get_skills(
|
|
|
42
40
|
return [
|
|
43
41
|
skill
|
|
44
42
|
for name in available_skills
|
|
45
|
-
if (skill := get_nation_skill(name
|
|
43
|
+
if (skill := get_nation_skill(name)) is not None
|
|
46
44
|
]
|
|
47
45
|
|
|
48
46
|
|
|
49
47
|
def get_nation_skill(
|
|
50
48
|
name: str,
|
|
51
|
-
|
|
52
|
-
) -> Optional[NationBaseTool]:
|
|
49
|
+
) -> NationBaseTool | None:
|
|
53
50
|
"""Get a nation skill by name."""
|
|
54
51
|
if name == "nft_check":
|
|
55
52
|
if name not in _cache:
|
|
56
|
-
_cache[name] = NftCheck(
|
|
57
|
-
skill_store=store,
|
|
58
|
-
)
|
|
53
|
+
_cache[name] = NftCheck()
|
|
59
54
|
return _cache[name]
|
|
60
55
|
else:
|
|
61
56
|
logger.error(f"Unknown Nation skill: {name}")
|
intentkit/skills/nation/base.py
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
from pydantic import BaseModel, Field
|
|
4
2
|
|
|
5
|
-
from intentkit.
|
|
3
|
+
from intentkit.config.config import config
|
|
6
4
|
from intentkit.skills.base import IntentKitSkill
|
|
7
5
|
|
|
8
6
|
default_nation_api_url = "http://backend-api"
|
|
@@ -13,17 +11,14 @@ class NationBaseTool(IntentKitSkill):
|
|
|
13
11
|
|
|
14
12
|
name: str = Field(description="The name of the tool")
|
|
15
13
|
description: str = Field(description="A description of what the tool does")
|
|
16
|
-
args_schema:
|
|
17
|
-
skill_store: SkillStoreABC = Field(
|
|
18
|
-
description="The skill store for persisting data"
|
|
19
|
-
)
|
|
14
|
+
args_schema: type[BaseModel]
|
|
20
15
|
|
|
21
16
|
def get_api_key(self) -> str:
|
|
22
|
-
return
|
|
17
|
+
return config.nation_api_key
|
|
23
18
|
|
|
24
19
|
def get_base_url(self) -> str:
|
|
25
|
-
if
|
|
26
|
-
return
|
|
20
|
+
if config.nation_api_url:
|
|
21
|
+
return config.nation_api_url
|
|
27
22
|
return default_nation_api_url
|
|
28
23
|
|
|
29
24
|
@property
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Optional, Type
|
|
3
2
|
|
|
4
3
|
import httpx
|
|
5
4
|
from eth_utils import is_address
|
|
@@ -11,7 +10,7 @@ logger = logging.getLogger(__name__)
|
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
class NftCheckInput(BaseModel):
|
|
14
|
-
nation_wallet_address:
|
|
13
|
+
nation_wallet_address: str | None = Field(
|
|
15
14
|
default=None, description="Nation wallet address"
|
|
16
15
|
)
|
|
17
16
|
|
|
@@ -19,9 +18,9 @@ class NftCheckInput(BaseModel):
|
|
|
19
18
|
class NftCheck(NationBaseTool):
|
|
20
19
|
name: str = "nft_check"
|
|
21
20
|
description: str = "Check user nation pass NFTs stats in nation, including usage status and linked agents.By default, it will use the user_id as the wallet address. If you want to check other wallet address, please pass the nation_wallet_address parameter."
|
|
22
|
-
args_schema:
|
|
21
|
+
args_schema: type[BaseModel] = NftCheckInput
|
|
23
22
|
|
|
24
|
-
async def _arun(self, nation_wallet_address:
|
|
23
|
+
async def _arun(self, nation_wallet_address: str | None = None) -> str:
|
|
25
24
|
"""Implementation of the NFT Check tool.
|
|
26
25
|
|
|
27
26
|
Args:
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
"description": "Check nation NFT stats",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/nation/nation.png",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"Crypto",
|
|
10
|
+
"NFT"
|
|
10
11
|
],
|
|
11
12
|
"properties": {
|
|
12
13
|
"enabled": {
|
|
@@ -55,4 +56,4 @@
|
|
|
55
56
|
"enabled"
|
|
56
57
|
],
|
|
57
58
|
"additionalProperties": true
|
|
58
|
-
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from cdp import EvmServerAccount
|
|
2
|
+
from web3 import Web3
|
|
3
|
+
|
|
4
|
+
from intentkit.clients import get_evm_account as fetch_evm_account
|
|
5
|
+
from intentkit.clients.web3 import get_web3_client
|
|
6
|
+
from intentkit.skills.base import IntentKitSkill
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class IntentKitOnChainSkill(IntentKitSkill):
|
|
10
|
+
"""Shared helpers for on-chain enabled skills."""
|
|
11
|
+
|
|
12
|
+
def web3_client(self) -> Web3:
|
|
13
|
+
"""Get a Web3 client for the active agent network."""
|
|
14
|
+
context = self.get_context()
|
|
15
|
+
agent = context.agent
|
|
16
|
+
network_id = agent.network_id
|
|
17
|
+
return get_web3_client(network_id)
|
|
18
|
+
|
|
19
|
+
async def get_evm_account(self) -> EvmServerAccount:
|
|
20
|
+
"""Fetch the EVM account associated with the active agent."""
|
|
21
|
+
context = self.get_context()
|
|
22
|
+
agent = context.agent
|
|
23
|
+
return await fetch_evm_account(agent)
|