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,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,
|
intentkit/skills/elfa/utils.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""Utility functions for Elfa skills."""
|
|
2
2
|
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
|
-
from
|
|
6
|
+
from langchain_core.tools.base import ToolException
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
9
9
|
from .base import base_url
|
|
@@ -14,13 +14,13 @@ class ElfaResponse(BaseModel):
|
|
|
14
14
|
|
|
15
15
|
success: bool
|
|
16
16
|
data: Any = None
|
|
17
|
-
metadata:
|
|
17
|
+
metadata: dict[str, Any] | None = None
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
async def make_elfa_request(
|
|
21
21
|
endpoint: str,
|
|
22
22
|
api_key: str,
|
|
23
|
-
params:
|
|
23
|
+
params: dict[str, Any] | None = None,
|
|
24
24
|
timeout: int = 30,
|
|
25
25
|
) -> ElfaResponse:
|
|
26
26
|
"""
|
|
@@ -82,32 +82,32 @@ async def make_elfa_request(
|
|
|
82
82
|
class RepostBreakdown(BaseModel):
|
|
83
83
|
"""Repost breakdown data."""
|
|
84
84
|
|
|
85
|
-
smart:
|
|
86
|
-
ct:
|
|
85
|
+
smart: int | None = None
|
|
86
|
+
ct: int | None = None
|
|
87
87
|
|
|
88
88
|
|
|
89
89
|
class Account(BaseModel):
|
|
90
90
|
"""Account information."""
|
|
91
91
|
|
|
92
|
-
username:
|
|
93
|
-
isVerified:
|
|
92
|
+
username: str | None = None
|
|
93
|
+
isVerified: bool | None = None
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
class MentionData(BaseModel):
|
|
97
97
|
"""Base mention data structure used across multiple endpoints."""
|
|
98
98
|
|
|
99
|
-
tweetId:
|
|
100
|
-
link:
|
|
101
|
-
likeCount:
|
|
102
|
-
repostCount:
|
|
103
|
-
viewCount:
|
|
104
|
-
quoteCount:
|
|
105
|
-
replyCount:
|
|
106
|
-
bookmarkCount:
|
|
107
|
-
mentionedAt:
|
|
108
|
-
type:
|
|
109
|
-
account:
|
|
110
|
-
repostBreakdown:
|
|
99
|
+
tweetId: str | None = Field(None, description="Tweet ID")
|
|
100
|
+
link: str | None = Field(None, description="Link to the tweet")
|
|
101
|
+
likeCount: int | None = Field(None, description="Number of likes")
|
|
102
|
+
repostCount: int | None = Field(None, description="Number of reposts")
|
|
103
|
+
viewCount: int | None = Field(None, description="Number of views")
|
|
104
|
+
quoteCount: int | None = Field(None, description="Number of quotes")
|
|
105
|
+
replyCount: int | None = Field(None, description="Number of replies")
|
|
106
|
+
bookmarkCount: int | None = Field(None, description="Number of bookmarks")
|
|
107
|
+
mentionedAt: str | None = Field(None, description="When mentioned")
|
|
108
|
+
type: str | None = Field(None, description="Post type")
|
|
109
|
+
account: Account | None = Field(None, description="Account information")
|
|
110
|
+
repostBreakdown: RepostBreakdown | None = Field(
|
|
111
111
|
None, description="Repost breakdown"
|
|
112
112
|
)
|
|
113
113
|
|
|
@@ -115,15 +115,13 @@ class MentionData(BaseModel):
|
|
|
115
115
|
class SmartStatsData(BaseModel):
|
|
116
116
|
"""Smart stats data structure."""
|
|
117
117
|
|
|
118
|
-
smartFollowingCount:
|
|
119
|
-
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
smartFollowerCount: Optional[int] = Field(None, description="Smart follower count")
|
|
124
|
-
followerCount: Optional[int] = Field(None, description="Total follower count")
|
|
118
|
+
smartFollowingCount: int | None = Field(None, description="Smart following count")
|
|
119
|
+
averageEngagement: float | None = Field(None, description="Average engagement")
|
|
120
|
+
averageReach: float | None = Field(None, description="Average reach")
|
|
121
|
+
smartFollowerCount: int | None = Field(None, description="Smart follower count")
|
|
122
|
+
followerCount: int | None = Field(None, description="Total follower count")
|
|
125
123
|
|
|
126
124
|
|
|
127
|
-
def clean_params(params:
|
|
125
|
+
def clean_params(params: dict[str, Any]) -> dict[str, Any]:
|
|
128
126
|
"""Remove None values from parameters dict."""
|
|
129
127
|
return {k: v for k, v in params.items() if v is not None}
|