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
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
Uses query ID 4832844 to retrieve a list of KOL buy transactions.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
import httpx
|
|
9
9
|
from pydantic import BaseModel, Field
|
|
10
10
|
from tenacity import retry, stop_after_attempt, wait_exponential
|
|
11
11
|
|
|
12
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
13
12
|
from intentkit.skills.dune_analytics.base import DuneBaseTool
|
|
14
13
|
|
|
15
14
|
BASE_URL = "https://api.dune.com/api/v1/query"
|
|
@@ -29,7 +28,7 @@ class KOLBuysInput(BaseModel):
|
|
|
29
28
|
class KOLBuyData(BaseModel):
|
|
30
29
|
"""Data model for KOL buy results."""
|
|
31
30
|
|
|
32
|
-
data:
|
|
31
|
+
data: dict[str, Any] = Field(description="KOL buy data from Dune API")
|
|
33
32
|
error: str = Field(default="", description="Error message if fetch failed")
|
|
34
33
|
|
|
35
34
|
|
|
@@ -48,15 +47,14 @@ class FetchKOLBuys(DuneBaseTool):
|
|
|
48
47
|
"Fetches a list of KOL memecoin buy transactions on Solana from Dune Analytics API using query ID 4832844. "
|
|
49
48
|
"Supports a configurable limit for the number of results. Handles rate limits with retries."
|
|
50
49
|
)
|
|
51
|
-
args_schema:
|
|
52
|
-
skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
|
|
50
|
+
args_schema: type[BaseModel] = KOLBuysInput
|
|
53
51
|
|
|
54
52
|
@retry(
|
|
55
53
|
stop=stop_after_attempt(3), wait=wait_exponential(multiplier=5, min=5, max=60)
|
|
56
54
|
)
|
|
57
55
|
async def fetch_data(
|
|
58
56
|
self, query_id: int, api_key: str, limit: int = 10
|
|
59
|
-
) ->
|
|
57
|
+
) -> dict[str, Any]:
|
|
60
58
|
"""Fetch data for a specific Dune query.
|
|
61
59
|
|
|
62
60
|
Args:
|
|
@@ -70,7 +68,7 @@ class FetchKOLBuys(DuneBaseTool):
|
|
|
70
68
|
Raises:
|
|
71
69
|
ToolException: If the API request fails.
|
|
72
70
|
"""
|
|
73
|
-
from
|
|
71
|
+
from langchain_core.tools.base import ToolException
|
|
74
72
|
|
|
75
73
|
url = f"{BASE_URL}/{query_id}/results?limit={limit}"
|
|
76
74
|
headers = {"X-Dune-API-Key": api_key}
|
|
@@ -5,13 +5,12 @@ Supports predefined metrics (e.g., total_users, unique_ai_citizens) or direct qu
|
|
|
5
5
|
|
|
6
6
|
import difflib
|
|
7
7
|
import re
|
|
8
|
-
from typing import Any
|
|
8
|
+
from typing import Any
|
|
9
9
|
|
|
10
10
|
import httpx
|
|
11
11
|
from pydantic import BaseModel, Field
|
|
12
12
|
from tenacity import retry, stop_after_attempt, wait_exponential
|
|
13
13
|
|
|
14
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
15
14
|
from intentkit.skills.dune_analytics.base import DuneBaseTool
|
|
16
15
|
|
|
17
16
|
SUPPORTED_QUERIES = {
|
|
@@ -63,14 +62,14 @@ class MetricData(BaseModel):
|
|
|
63
62
|
"""Data model for a single metric result."""
|
|
64
63
|
|
|
65
64
|
metric: str = Field(description="Metric name or query ID")
|
|
66
|
-
data:
|
|
65
|
+
data: dict[str, Any] = Field(description="Metric data from Dune API")
|
|
67
66
|
error: str = Field(default="", description="Error message if fetch failed")
|
|
68
67
|
|
|
69
68
|
|
|
70
69
|
class NationMetricsOutput(BaseModel):
|
|
71
70
|
"""Output schema for Crestal Nation metrics."""
|
|
72
71
|
|
|
73
|
-
metrics:
|
|
72
|
+
metrics: dict[str, MetricData] = Field(
|
|
74
73
|
description="Dictionary of metric names or query IDs to their data"
|
|
75
74
|
)
|
|
76
75
|
summary: str = Field(description="Summary of fetched metrics")
|
|
@@ -85,8 +84,7 @@ class FetchNationMetrics(DuneBaseTool):
|
|
|
85
84
|
"Supports predefined metrics, direct query IDs, or all configured metrics if none specified. "
|
|
86
85
|
"Handles rate limits with retries."
|
|
87
86
|
)
|
|
88
|
-
args_schema:
|
|
89
|
-
skill_store: SkillStoreABC = Field(description="Skill store for data persistence")
|
|
87
|
+
args_schema: type[BaseModel] = NationMetricsInput
|
|
90
88
|
|
|
91
89
|
def normalize_metric(self, metric: str) -> str:
|
|
92
90
|
"""Normalize a metric string for matching.
|
|
@@ -124,7 +122,7 @@ class FetchNationMetrics(DuneBaseTool):
|
|
|
124
122
|
)
|
|
125
123
|
async def fetch_data(
|
|
126
124
|
self, query_id: int, api_key: str, limit: int = 1000
|
|
127
|
-
) ->
|
|
125
|
+
) -> dict[str, Any]:
|
|
128
126
|
"""Fetch data for a specific Dune query.
|
|
129
127
|
|
|
130
128
|
Args:
|
|
@@ -138,7 +136,7 @@ class FetchNationMetrics(DuneBaseTool):
|
|
|
138
136
|
Raises:
|
|
139
137
|
ToolException: If the API request fails.
|
|
140
138
|
"""
|
|
141
|
-
from
|
|
139
|
+
from langchain_core.tools.base import ToolException
|
|
142
140
|
|
|
143
141
|
url = f"{BASE_URL}/{query_id}/results?limit={limit}"
|
|
144
142
|
headers = {"X-Dune-API-Key": api_key}
|
|
@@ -1,99 +1,104 @@
|
|
|
1
|
-
{
|
|
2
|
-
"title": "Dune Analytics",
|
|
3
|
-
"description": "Dune Analytics skills to fetch data from Dune Analytics API.",
|
|
4
|
-
"x-icon": "https://ai.service.crestal.dev/skills/dune_analytics/dune.png",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"properties": {
|
|
7
|
-
"enabled": {
|
|
8
|
-
"type": "boolean",
|
|
9
|
-
"title": "Enabled",
|
|
10
|
-
"description": "Whether this skill is enabled",
|
|
11
|
-
"default": false
|
|
12
|
-
},
|
|
13
|
-
"states": {
|
|
14
|
-
"title": "Skill States",
|
|
15
|
-
"type": "object",
|
|
16
|
-
"properties": {
|
|
17
|
-
"fetch_nation_metrics": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"title": "Fetch Crestal Nation Metrics",
|
|
20
|
-
"enum": [
|
|
21
|
-
"disabled",
|
|
22
|
-
"public",
|
|
23
|
-
"private"
|
|
24
|
-
],
|
|
25
|
-
"x-enum-title": [
|
|
26
|
-
"Disabled",
|
|
27
|
-
"Agent Owner + All Users",
|
|
28
|
-
"Agent Owner Only"
|
|
29
|
-
],
|
|
30
|
-
"description": "Fetches Crestal Nation metrics (e.g., total_users, agents/citizens, market_cap) from Dune Analytics API.",
|
|
31
|
-
"default": "disabled"
|
|
32
|
-
},
|
|
33
|
-
"fetch_kol_buys": {
|
|
34
|
-
"type": "string",
|
|
35
|
-
"title": "Fetch KOL Memecoin Buys",
|
|
36
|
-
"enum": [
|
|
37
|
-
"disabled",
|
|
38
|
-
"public",
|
|
39
|
-
"private"
|
|
40
|
-
],
|
|
41
|
-
"x-enum-title": [
|
|
42
|
-
"Disabled",
|
|
43
|
-
"Agent Owner + All Users",
|
|
44
|
-
"Agent Owner Only"
|
|
45
|
-
],
|
|
46
|
-
"description": "Fetches a list of KOL memecoin buy transactions on Solana from Dune Analytics API.",
|
|
47
|
-
"default": "disabled"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
"api_key_provider": {
|
|
52
|
-
"type": "string",
|
|
53
|
-
"title": "API Key Provider",
|
|
54
|
-
"description": "Provider of the API key for Dune service",
|
|
55
|
-
"enum": [
|
|
56
|
-
"agent_owner"
|
|
57
|
-
],
|
|
58
|
-
"x-enum-title": [
|
|
59
|
-
"Owner Provided"
|
|
60
|
-
],
|
|
61
|
-
"default": "agent_owner"
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
"required": [
|
|
65
|
-
"states",
|
|
66
|
-
"enabled"
|
|
67
|
-
],
|
|
68
|
-
"if": {
|
|
69
|
-
"properties": {
|
|
70
|
-
"api_key_provider": {
|
|
71
|
-
"const": "agent_owner"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
"then": {
|
|
76
|
-
"properties": {
|
|
77
|
-
"api_key": {
|
|
78
|
-
"type": "string",
|
|
79
|
-
"title": "Dune API Key",
|
|
80
|
-
"description": "API key for Dune Analytics (X-Dune-API-Key).",
|
|
81
|
-
"x-link": "[Get your API key](https://docs.dune.com/api-reference/overview/authentication)",
|
|
82
|
-
"x-sensitive": true
|
|
83
|
-
}
|
|
84
|
-
},
|
|
85
|
-
"if": {
|
|
86
|
-
"properties": {
|
|
87
|
-
"enabled": {
|
|
88
|
-
"const": true
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
"then": {
|
|
93
|
-
"required": [
|
|
94
|
-
"api_key"
|
|
95
|
-
]
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
"additionalProperties": true
|
|
99
|
-
|
|
1
|
+
{
|
|
2
|
+
"title": "Dune Analytics",
|
|
3
|
+
"description": "Dune Analytics skills to fetch data from Dune Analytics API.",
|
|
4
|
+
"x-icon": "https://ai.service.crestal.dev/skills/dune_analytics/dune.png",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"enabled": {
|
|
8
|
+
"type": "boolean",
|
|
9
|
+
"title": "Enabled",
|
|
10
|
+
"description": "Whether this skill is enabled",
|
|
11
|
+
"default": false
|
|
12
|
+
},
|
|
13
|
+
"states": {
|
|
14
|
+
"title": "Skill States",
|
|
15
|
+
"type": "object",
|
|
16
|
+
"properties": {
|
|
17
|
+
"fetch_nation_metrics": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"title": "Fetch Crestal Nation Metrics",
|
|
20
|
+
"enum": [
|
|
21
|
+
"disabled",
|
|
22
|
+
"public",
|
|
23
|
+
"private"
|
|
24
|
+
],
|
|
25
|
+
"x-enum-title": [
|
|
26
|
+
"Disabled",
|
|
27
|
+
"Agent Owner + All Users",
|
|
28
|
+
"Agent Owner Only"
|
|
29
|
+
],
|
|
30
|
+
"description": "Fetches Crestal Nation metrics (e.g., total_users, agents/citizens, market_cap) from Dune Analytics API.",
|
|
31
|
+
"default": "disabled"
|
|
32
|
+
},
|
|
33
|
+
"fetch_kol_buys": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"title": "Fetch KOL Memecoin Buys",
|
|
36
|
+
"enum": [
|
|
37
|
+
"disabled",
|
|
38
|
+
"public",
|
|
39
|
+
"private"
|
|
40
|
+
],
|
|
41
|
+
"x-enum-title": [
|
|
42
|
+
"Disabled",
|
|
43
|
+
"Agent Owner + All Users",
|
|
44
|
+
"Agent Owner Only"
|
|
45
|
+
],
|
|
46
|
+
"description": "Fetches a list of KOL memecoin buy transactions on Solana from Dune Analytics API.",
|
|
47
|
+
"default": "disabled"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"api_key_provider": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"title": "API Key Provider",
|
|
54
|
+
"description": "Provider of the API key for Dune service",
|
|
55
|
+
"enum": [
|
|
56
|
+
"agent_owner"
|
|
57
|
+
],
|
|
58
|
+
"x-enum-title": [
|
|
59
|
+
"Owner Provided"
|
|
60
|
+
],
|
|
61
|
+
"default": "agent_owner"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"required": [
|
|
65
|
+
"states",
|
|
66
|
+
"enabled"
|
|
67
|
+
],
|
|
68
|
+
"if": {
|
|
69
|
+
"properties": {
|
|
70
|
+
"api_key_provider": {
|
|
71
|
+
"const": "agent_owner"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"then": {
|
|
76
|
+
"properties": {
|
|
77
|
+
"api_key": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"title": "Dune API Key",
|
|
80
|
+
"description": "API key for Dune Analytics (X-Dune-API-Key).",
|
|
81
|
+
"x-link": "[Get your API key](https://docs.dune.com/api-reference/overview/authentication)",
|
|
82
|
+
"x-sensitive": true
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"if": {
|
|
86
|
+
"properties": {
|
|
87
|
+
"enabled": {
|
|
88
|
+
"const": true
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"then": {
|
|
93
|
+
"required": [
|
|
94
|
+
"api_key"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"additionalProperties": true,
|
|
99
|
+
"x-tags": [
|
|
100
|
+
"Analytics",
|
|
101
|
+
"Crypto",
|
|
102
|
+
"Knowledge Base"
|
|
103
|
+
]
|
|
104
|
+
}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import logging
|
|
4
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.elfa.base import ElfaBaseTool
|
|
9
8
|
from intentkit.skills.elfa.mention import (
|
|
@@ -36,7 +35,6 @@ class Config(SkillConfig):
|
|
|
36
35
|
async def get_skills(
|
|
37
36
|
config: "Config",
|
|
38
37
|
is_private: bool,
|
|
39
|
-
store: SkillStoreABC,
|
|
40
38
|
**_,
|
|
41
39
|
) -> list[ElfaBaseTool]:
|
|
42
40
|
"""Get all Elfa skills.
|
|
@@ -44,7 +42,6 @@ async def get_skills(
|
|
|
44
42
|
Args:
|
|
45
43
|
config: The configuration for Elfa skills.
|
|
46
44
|
is_private: Whether to include private skills.
|
|
47
|
-
store: The skill store for persisting data.
|
|
48
45
|
|
|
49
46
|
Returns:
|
|
50
47
|
A list of Elfa skills.
|
|
@@ -61,7 +58,7 @@ async def get_skills(
|
|
|
61
58
|
# Get each skill using the cached getter
|
|
62
59
|
result = []
|
|
63
60
|
for name in available_skills:
|
|
64
|
-
skill = get_elfa_skill(name
|
|
61
|
+
skill = get_elfa_skill(name)
|
|
65
62
|
if skill:
|
|
66
63
|
result.append(skill)
|
|
67
64
|
return result
|
|
@@ -69,13 +66,11 @@ async def get_skills(
|
|
|
69
66
|
|
|
70
67
|
def get_elfa_skill(
|
|
71
68
|
name: str,
|
|
72
|
-
store: SkillStoreABC,
|
|
73
69
|
) -> ElfaBaseTool:
|
|
74
70
|
"""Get an Elfa skill by name.
|
|
75
71
|
|
|
76
72
|
Args:
|
|
77
73
|
name: The name of the skill to get
|
|
78
|
-
store: The skill store for persisting data
|
|
79
74
|
|
|
80
75
|
Returns:
|
|
81
76
|
The requested Elfa skill
|
|
@@ -83,30 +78,22 @@ def get_elfa_skill(
|
|
|
83
78
|
|
|
84
79
|
if name == "get_top_mentions":
|
|
85
80
|
if name not in _cache:
|
|
86
|
-
_cache[name] = ElfaGetTopMentions(
|
|
87
|
-
skill_store=store,
|
|
88
|
-
)
|
|
81
|
+
_cache[name] = ElfaGetTopMentions()
|
|
89
82
|
return _cache[name]
|
|
90
83
|
|
|
91
84
|
elif name == "search_mentions":
|
|
92
85
|
if name not in _cache:
|
|
93
|
-
_cache[name] = ElfaSearchMentions(
|
|
94
|
-
skill_store=store,
|
|
95
|
-
)
|
|
86
|
+
_cache[name] = ElfaSearchMentions()
|
|
96
87
|
return _cache[name]
|
|
97
88
|
|
|
98
89
|
elif name == "get_trending_tokens":
|
|
99
90
|
if name not in _cache:
|
|
100
|
-
_cache[name] = ElfaGetTrendingTokens(
|
|
101
|
-
skill_store=store,
|
|
102
|
-
)
|
|
91
|
+
_cache[name] = ElfaGetTrendingTokens()
|
|
103
92
|
return _cache[name]
|
|
104
93
|
|
|
105
94
|
elif name == "get_smart_stats":
|
|
106
95
|
if name not in _cache:
|
|
107
|
-
_cache[name] = ElfaGetSmartStats(
|
|
108
|
-
skill_store=store,
|
|
109
|
-
)
|
|
96
|
+
_cache[name] = ElfaGetSmartStats()
|
|
110
97
|
return _cache[name]
|
|
111
98
|
|
|
112
99
|
else:
|
intentkit/skills/elfa/base.py
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from langchain.tools.base import ToolException
|
|
1
|
+
from langchain_core.tools.base import ToolException
|
|
4
2
|
from pydantic import BaseModel, Field
|
|
5
3
|
|
|
6
|
-
from intentkit.
|
|
4
|
+
from intentkit.config.config import config
|
|
7
5
|
from intentkit.skills.base import IntentKitSkill
|
|
8
6
|
|
|
9
7
|
base_url = "https://api.elfa.ai/v2"
|
|
@@ -14,24 +12,22 @@ class ElfaBaseTool(IntentKitSkill):
|
|
|
14
12
|
|
|
15
13
|
name: str = Field(description="The name of the tool")
|
|
16
14
|
description: str = Field(description="A description of what the tool does")
|
|
17
|
-
args_schema:
|
|
18
|
-
skill_store: SkillStoreABC = Field(
|
|
19
|
-
description="The skill store for persisting data"
|
|
20
|
-
)
|
|
15
|
+
args_schema: type[BaseModel]
|
|
21
16
|
|
|
22
17
|
def get_api_key(self) -> str:
|
|
23
18
|
context = self.get_context()
|
|
24
19
|
skill_config = context.agent.skill_config(self.category)
|
|
25
20
|
api_key_provider = skill_config.get("api_key_provider")
|
|
26
21
|
if api_key_provider == "platform":
|
|
27
|
-
|
|
22
|
+
if not config.elfa_api_key:
|
|
23
|
+
raise ToolException("Elfa API key is not configured")
|
|
24
|
+
return config.elfa_api_key
|
|
28
25
|
# for backward compatibility, may only have api_key in skill_config
|
|
29
|
-
|
|
26
|
+
if skill_config.get("api_key"):
|
|
30
27
|
return skill_config.get("api_key")
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
)
|
|
28
|
+
raise ToolException(
|
|
29
|
+
f"Invalid API key provider: {api_key_provider}, or no api_key in config"
|
|
30
|
+
)
|
|
35
31
|
|
|
36
32
|
@property
|
|
37
33
|
def category(self) -> str:
|
intentkit/skills/elfa/mention.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Mention-related skills for Elfa AI API."""
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
@@ -12,19 +12,19 @@ class ElfaGetTopMentionsInput(BaseModel):
|
|
|
12
12
|
"""Input parameters for top mentions."""
|
|
13
13
|
|
|
14
14
|
ticker: str = Field(description="Stock ticker symbol (e.g., ETH, $ETH, BTC, $BTC)")
|
|
15
|
-
timeWindow:
|
|
15
|
+
timeWindow: str | None = Field(
|
|
16
16
|
"1h", description="Time window (e.g., '1h', '24h', '7d')"
|
|
17
17
|
)
|
|
18
|
-
page:
|
|
19
|
-
pageSize:
|
|
18
|
+
page: int | None = Field(1, description="Page number for pagination")
|
|
19
|
+
pageSize: int | None = Field(10, description="Number of items per page")
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class ElfaGetTopMentionsOutput(BaseModel):
|
|
23
23
|
"""Output structure for top mentions response."""
|
|
24
24
|
|
|
25
25
|
success: bool
|
|
26
|
-
data:
|
|
27
|
-
metadata:
|
|
26
|
+
data: list[MentionData] | None = Field(None, description="List of top mentions")
|
|
27
|
+
metadata: dict[str, Any] | None = Field(None, description="Response metadata")
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class ElfaGetTopMentions(ElfaBaseTool):
|
|
@@ -46,7 +46,7 @@ class ElfaGetTopMentions(ElfaBaseTool):
|
|
|
46
46
|
Updated hourly. Returns engagement metrics and account information for market sentiment analysis.
|
|
47
47
|
|
|
48
48
|
Use this to track public opinion, identify trending news, and monitor investor discussions."""
|
|
49
|
-
args_schema:
|
|
49
|
+
args_schema: type[BaseModel] = ElfaGetTopMentionsInput
|
|
50
50
|
|
|
51
51
|
async def _arun(
|
|
52
52
|
self,
|
|
@@ -102,30 +102,28 @@ class ElfaGetTopMentions(ElfaBaseTool):
|
|
|
102
102
|
class ElfaSearchMentionsInput(BaseModel):
|
|
103
103
|
"""Input parameters for search mentions."""
|
|
104
104
|
|
|
105
|
-
keywords:
|
|
105
|
+
keywords: str | None = Field(
|
|
106
106
|
None,
|
|
107
107
|
description="Up to 5 keywords to search for, separated by commas. Phrases accepted",
|
|
108
108
|
)
|
|
109
|
-
accountName:
|
|
109
|
+
accountName: str | None = Field(
|
|
110
110
|
None,
|
|
111
111
|
description="Account username to filter by (optional if keywords provided)",
|
|
112
112
|
)
|
|
113
|
-
timeWindow:
|
|
114
|
-
limit:
|
|
115
|
-
searchType:
|
|
116
|
-
|
|
117
|
-
)
|
|
118
|
-
cursor: Optional[str] = Field(None, description="Cursor for pagination")
|
|
113
|
+
timeWindow: str | None = Field("7d", description="Time window for search")
|
|
114
|
+
limit: int | None = Field(20, description="Number of results to return (max 30)")
|
|
115
|
+
searchType: str | None = Field("or", description="Type of search ('and' or 'or')")
|
|
116
|
+
cursor: str | None = Field(None, description="Cursor for pagination")
|
|
119
117
|
|
|
120
118
|
|
|
121
119
|
class ElfaSearchMentionsOutput(BaseModel):
|
|
122
120
|
"""Output structure for search mentions response."""
|
|
123
121
|
|
|
124
122
|
success: bool
|
|
125
|
-
data:
|
|
123
|
+
data: list[MentionData] | None = Field(
|
|
126
124
|
None, description="List of matching mentions"
|
|
127
125
|
)
|
|
128
|
-
metadata:
|
|
126
|
+
metadata: dict[str, Any] | None = Field(
|
|
129
127
|
None, description="Response metadata with cursor"
|
|
130
128
|
)
|
|
131
129
|
|
|
@@ -150,16 +148,16 @@ class ElfaSearchMentions(ElfaBaseTool):
|
|
|
150
148
|
Updated every 5 minutes. Access 30 days of recent data or historical archives.
|
|
151
149
|
|
|
152
150
|
Use this for market research, brand monitoring, opinion tracking, and competitive analysis."""
|
|
153
|
-
args_schema:
|
|
151
|
+
args_schema: type[BaseModel] = ElfaSearchMentionsInput
|
|
154
152
|
|
|
155
153
|
async def _arun(
|
|
156
154
|
self,
|
|
157
|
-
keywords:
|
|
158
|
-
accountName:
|
|
155
|
+
keywords: str | None = None,
|
|
156
|
+
accountName: str | None = None,
|
|
159
157
|
timeWindow: str = "7d",
|
|
160
158
|
limit: int = 20,
|
|
161
159
|
searchType: str = "or",
|
|
162
|
-
cursor:
|
|
160
|
+
cursor: str | None = None,
|
|
163
161
|
**kwargs,
|
|
164
162
|
) -> ElfaSearchMentionsOutput:
|
|
165
163
|
"""
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
"description": "Integration with Elfa AI API providing data analysis and processing capabilities with secure authentication for advanced data operations",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/elfa/elfa.jpg",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
8
|
+
"AI",
|
|
9
|
+
"Analytics"
|
|
9
10
|
],
|
|
10
11
|
"x-nft-requirement": 1,
|
|
11
12
|
"properties": {
|
|
@@ -13,7 +14,7 @@
|
|
|
13
14
|
"type": "boolean",
|
|
14
15
|
"title": "Enabled",
|
|
15
16
|
"description": "Whether this skill is enabled",
|
|
16
|
-
"default":
|
|
17
|
+
"default": false
|
|
17
18
|
},
|
|
18
19
|
"states": {
|
|
19
20
|
"type": "object",
|
intentkit/skills/elfa/stats.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Smart stats skill for Elfa AI API."""
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
@@ -18,8 +18,8 @@ class ElfaGetSmartStatsOutput(BaseModel):
|
|
|
18
18
|
"""Output structure for smart stats response."""
|
|
19
19
|
|
|
20
20
|
success: bool
|
|
21
|
-
data:
|
|
22
|
-
metadata:
|
|
21
|
+
data: SmartStatsData | None = Field(None, description="Smart stats data")
|
|
22
|
+
metadata: dict[str, Any] | None = Field(None, description="Response metadata")
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class ElfaGetSmartStats(ElfaBaseTool):
|
|
@@ -43,7 +43,7 @@ class ElfaGetSmartStats(ElfaBaseTool):
|
|
|
43
43
|
description: str = """Get comprehensive social media metrics for a username including smart following count,
|
|
44
44
|
engagement scores, and follower analytics. Use this for competitor analysis, influencer identification,
|
|
45
45
|
and social media performance audits."""
|
|
46
|
-
args_schema:
|
|
46
|
+
args_schema: type[BaseModel] = ElfaGetSmartStatsInput
|
|
47
47
|
|
|
48
48
|
async def _arun(self, username: str, **kwargs) -> ElfaGetSmartStatsOutput:
|
|
49
49
|
"""
|
intentkit/skills/elfa/tokens.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Trending tokens skill for Elfa AI API."""
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
@@ -11,13 +11,13 @@ from .utils import make_elfa_request
|
|
|
11
11
|
class ElfaGetTrendingTokensInput(BaseModel):
|
|
12
12
|
"""Input parameters for trending tokens."""
|
|
13
13
|
|
|
14
|
-
timeWindow:
|
|
14
|
+
timeWindow: str | None = Field(
|
|
15
15
|
"7d",
|
|
16
16
|
description="Time window for trending analysis (e.g., '30m', '1h', '4h', '24h', '7d', '30d')",
|
|
17
17
|
)
|
|
18
|
-
page:
|
|
19
|
-
pageSize:
|
|
20
|
-
minMentions:
|
|
18
|
+
page: int | None = Field(1, description="Page number for pagination")
|
|
19
|
+
pageSize: int | None = Field(50, description="Number of items per page")
|
|
20
|
+
minMentions: int | None = Field(
|
|
21
21
|
5, description="Minimum number of mentions required"
|
|
22
22
|
)
|
|
23
23
|
|
|
@@ -25,20 +25,20 @@ class ElfaGetTrendingTokensInput(BaseModel):
|
|
|
25
25
|
class TrendingToken(BaseModel):
|
|
26
26
|
"""Individual trending token data."""
|
|
27
27
|
|
|
28
|
-
token:
|
|
29
|
-
current_count:
|
|
30
|
-
previous_count:
|
|
31
|
-
change_percent:
|
|
28
|
+
token: str | None = Field(None, description="Token symbol")
|
|
29
|
+
current_count: int | None = Field(None, description="Current mention count")
|
|
30
|
+
previous_count: int | None = Field(None, description="Previous mention count")
|
|
31
|
+
change_percent: float | None = Field(None, description="Change percentage")
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class ElfaGetTrendingTokensOutput(BaseModel):
|
|
35
35
|
"""Output structure for trending tokens response."""
|
|
36
36
|
|
|
37
37
|
success: bool
|
|
38
|
-
data:
|
|
38
|
+
data: list[TrendingToken] | None = Field(
|
|
39
39
|
None, description="List of trending tokens"
|
|
40
40
|
)
|
|
41
|
-
metadata:
|
|
41
|
+
metadata: dict[str, Any] | None = Field(None, description="Response metadata")
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class ElfaGetTrendingTokens(ElfaBaseTool):
|
|
@@ -60,7 +60,7 @@ class ElfaGetTrendingTokens(ElfaBaseTool):
|
|
|
60
60
|
Updated every 5 minutes. Smart mentions provide sophisticated discussion volume measurement beyond simple keyword counts.
|
|
61
61
|
|
|
62
62
|
Use this to identify tokens gaining traction, gauge market sentiment, and research potential investments."""
|
|
63
|
-
args_schema:
|
|
63
|
+
args_schema: type[BaseModel] = ElfaGetTrendingTokensInput
|
|
64
64
|
|
|
65
65
|
async def _arun(
|
|
66
66
|
self,
|