intentkit 0.5.0__py3-none-any.whl → 0.5.2__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 +17 -0
- intentkit/abstracts/__init__.py +0 -0
- intentkit/abstracts/agent.py +60 -0
- intentkit/abstracts/api.py +4 -0
- intentkit/abstracts/engine.py +38 -0
- intentkit/abstracts/exception.py +9 -0
- intentkit/abstracts/graph.py +25 -0
- intentkit/abstracts/skill.py +129 -0
- intentkit/abstracts/twitter.py +54 -0
- intentkit/clients/__init__.py +14 -0
- intentkit/clients/cdp.py +53 -0
- intentkit/clients/twitter.py +445 -0
- intentkit/config/__init__.py +0 -0
- intentkit/config/config.py +164 -0
- intentkit/core/__init__.py +0 -0
- intentkit/core/agent.py +191 -0
- intentkit/core/api.py +40 -0
- intentkit/core/client.py +45 -0
- intentkit/core/credit.py +1767 -0
- intentkit/core/engine.py +1018 -0
- intentkit/core/node.py +223 -0
- intentkit/core/prompt.py +58 -0
- intentkit/core/skill.py +124 -0
- intentkit/models/agent.py +1689 -0
- intentkit/models/agent_data.py +810 -0
- intentkit/models/agent_schema.json +733 -0
- intentkit/models/app_setting.py +156 -0
- intentkit/models/base.py +9 -0
- intentkit/models/chat.py +581 -0
- intentkit/models/conversation.py +286 -0
- intentkit/models/credit.py +1406 -0
- intentkit/models/db.py +120 -0
- intentkit/models/db_mig.py +102 -0
- intentkit/models/generator.py +347 -0
- intentkit/models/llm.py +746 -0
- intentkit/models/redis.py +132 -0
- intentkit/models/skill.py +466 -0
- intentkit/models/user.py +243 -0
- intentkit/skills/__init__.py +12 -0
- intentkit/skills/acolyt/__init__.py +83 -0
- intentkit/skills/acolyt/acolyt.jpg +0 -0
- intentkit/skills/acolyt/ask.py +128 -0
- intentkit/skills/acolyt/base.py +28 -0
- intentkit/skills/acolyt/schema.json +89 -0
- intentkit/skills/aixbt/README.md +71 -0
- intentkit/skills/aixbt/__init__.py +73 -0
- intentkit/skills/aixbt/aixbt.jpg +0 -0
- intentkit/skills/aixbt/base.py +21 -0
- intentkit/skills/aixbt/projects.py +153 -0
- intentkit/skills/aixbt/schema.json +99 -0
- intentkit/skills/allora/__init__.py +83 -0
- intentkit/skills/allora/allora.jpeg +0 -0
- intentkit/skills/allora/base.py +28 -0
- intentkit/skills/allora/price.py +130 -0
- intentkit/skills/allora/schema.json +89 -0
- intentkit/skills/base.py +174 -0
- intentkit/skills/carv/README.md +95 -0
- intentkit/skills/carv/__init__.py +121 -0
- intentkit/skills/carv/base.py +183 -0
- intentkit/skills/carv/carv.webp +0 -0
- intentkit/skills/carv/fetch_news.py +92 -0
- intentkit/skills/carv/onchain_query.py +164 -0
- intentkit/skills/carv/schema.json +137 -0
- intentkit/skills/carv/token_info_and_price.py +110 -0
- intentkit/skills/cdp/__init__.py +137 -0
- intentkit/skills/cdp/base.py +21 -0
- intentkit/skills/cdp/cdp.png +0 -0
- intentkit/skills/cdp/get_balance.py +81 -0
- intentkit/skills/cdp/schema.json +473 -0
- intentkit/skills/chainlist/README.md +38 -0
- intentkit/skills/chainlist/__init__.py +54 -0
- intentkit/skills/chainlist/base.py +21 -0
- intentkit/skills/chainlist/chain_lookup.py +208 -0
- intentkit/skills/chainlist/chainlist.png +0 -0
- intentkit/skills/chainlist/schema.json +47 -0
- intentkit/skills/common/__init__.py +82 -0
- intentkit/skills/common/base.py +21 -0
- intentkit/skills/common/common.jpg +0 -0
- intentkit/skills/common/current_time.py +84 -0
- intentkit/skills/common/schema.json +57 -0
- intentkit/skills/cookiefun/README.md +121 -0
- intentkit/skills/cookiefun/__init__.py +78 -0
- intentkit/skills/cookiefun/base.py +41 -0
- intentkit/skills/cookiefun/constants.py +18 -0
- intentkit/skills/cookiefun/cookiefun.png +0 -0
- intentkit/skills/cookiefun/get_account_details.py +171 -0
- intentkit/skills/cookiefun/get_account_feed.py +282 -0
- intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
- intentkit/skills/cookiefun/get_sectors.py +128 -0
- intentkit/skills/cookiefun/schema.json +155 -0
- intentkit/skills/cookiefun/search_accounts.py +225 -0
- intentkit/skills/cryptocompare/__init__.py +130 -0
- intentkit/skills/cryptocompare/api.py +159 -0
- intentkit/skills/cryptocompare/base.py +303 -0
- intentkit/skills/cryptocompare/cryptocompare.png +0 -0
- intentkit/skills/cryptocompare/fetch_news.py +96 -0
- intentkit/skills/cryptocompare/fetch_price.py +99 -0
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
- intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
- intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
- intentkit/skills/cryptocompare/schema.json +168 -0
- intentkit/skills/cryptopanic/__init__.py +108 -0
- intentkit/skills/cryptopanic/base.py +51 -0
- intentkit/skills/cryptopanic/cryptopanic.png +0 -0
- intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
- intentkit/skills/cryptopanic/schema.json +103 -0
- intentkit/skills/dapplooker/README.md +92 -0
- intentkit/skills/dapplooker/__init__.py +83 -0
- intentkit/skills/dapplooker/base.py +26 -0
- intentkit/skills/dapplooker/dapplooker.jpg +0 -0
- intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
- intentkit/skills/dapplooker/schema.json +91 -0
- intentkit/skills/defillama/__init__.py +323 -0
- intentkit/skills/defillama/api.py +315 -0
- intentkit/skills/defillama/base.py +135 -0
- intentkit/skills/defillama/coins/__init__.py +0 -0
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
- intentkit/skills/defillama/coins/fetch_block.py +98 -0
- intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
- intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
- intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
- intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
- intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
- intentkit/skills/defillama/config/__init__.py +0 -0
- intentkit/skills/defillama/config/chains.py +433 -0
- intentkit/skills/defillama/defillama.jpeg +0 -0
- intentkit/skills/defillama/fees/__init__.py +0 -0
- intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
- intentkit/skills/defillama/schema.json +383 -0
- intentkit/skills/defillama/stablecoins/__init__.py +0 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
- intentkit/skills/defillama/tests/__init__.py +0 -0
- intentkit/skills/defillama/tests/api_integration.test.py +192 -0
- intentkit/skills/defillama/tests/api_unit.test.py +583 -0
- intentkit/skills/defillama/tvl/__init__.py +0 -0
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
- intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
- intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
- intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
- intentkit/skills/defillama/volumes/__init__.py +0 -0
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
- intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
- intentkit/skills/defillama/yields/__init__.py +0 -0
- intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
- intentkit/skills/defillama/yields/fetch_pools.py +126 -0
- intentkit/skills/dexscreener/__init__.py +93 -0
- intentkit/skills/dexscreener/base.py +133 -0
- intentkit/skills/dexscreener/dexscreener.png +0 -0
- intentkit/skills/dexscreener/model/__init__.py +0 -0
- intentkit/skills/dexscreener/model/search_token_response.py +82 -0
- intentkit/skills/dexscreener/schema.json +48 -0
- intentkit/skills/dexscreener/search_token.py +321 -0
- intentkit/skills/dune_analytics/__init__.py +103 -0
- intentkit/skills/dune_analytics/base.py +46 -0
- intentkit/skills/dune_analytics/dune.png +0 -0
- intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
- intentkit/skills/dune_analytics/schema.json +99 -0
- intentkit/skills/elfa/README.md +100 -0
- intentkit/skills/elfa/__init__.py +123 -0
- intentkit/skills/elfa/base.py +28 -0
- intentkit/skills/elfa/elfa.jpg +0 -0
- intentkit/skills/elfa/mention.py +504 -0
- intentkit/skills/elfa/schema.json +153 -0
- intentkit/skills/elfa/stats.py +118 -0
- intentkit/skills/elfa/tokens.py +126 -0
- intentkit/skills/enso/README.md +75 -0
- intentkit/skills/enso/__init__.py +114 -0
- intentkit/skills/enso/abi/__init__.py +0 -0
- intentkit/skills/enso/abi/approval.py +279 -0
- intentkit/skills/enso/abi/erc20.py +14 -0
- intentkit/skills/enso/abi/route.py +129 -0
- intentkit/skills/enso/base.py +44 -0
- intentkit/skills/enso/best_yield.py +286 -0
- intentkit/skills/enso/enso.jpg +0 -0
- intentkit/skills/enso/networks.py +105 -0
- intentkit/skills/enso/prices.py +93 -0
- intentkit/skills/enso/route.py +300 -0
- intentkit/skills/enso/schema.json +212 -0
- intentkit/skills/enso/tokens.py +223 -0
- intentkit/skills/enso/wallet.py +381 -0
- intentkit/skills/github/README.md +63 -0
- intentkit/skills/github/__init__.py +54 -0
- intentkit/skills/github/base.py +21 -0
- intentkit/skills/github/github.jpg +0 -0
- intentkit/skills/github/github_search.py +183 -0
- intentkit/skills/github/schema.json +59 -0
- intentkit/skills/heurist/__init__.py +143 -0
- intentkit/skills/heurist/base.py +26 -0
- intentkit/skills/heurist/heurist.png +0 -0
- intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
- intentkit/skills/heurist/image_generation_braindance.py +162 -0
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
- intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
- intentkit/skills/heurist/image_generation_sdxl.py +161 -0
- intentkit/skills/heurist/schema.json +196 -0
- intentkit/skills/lifi/README.md +294 -0
- intentkit/skills/lifi/__init__.py +141 -0
- intentkit/skills/lifi/base.py +21 -0
- intentkit/skills/lifi/lifi.png +0 -0
- intentkit/skills/lifi/schema.json +89 -0
- intentkit/skills/lifi/token_execute.py +472 -0
- intentkit/skills/lifi/token_quote.py +190 -0
- intentkit/skills/lifi/utils.py +656 -0
- intentkit/skills/moralis/README.md +490 -0
- intentkit/skills/moralis/__init__.py +110 -0
- intentkit/skills/moralis/api.py +281 -0
- intentkit/skills/moralis/base.py +55 -0
- intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
- intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
- intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
- intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
- intentkit/skills/moralis/moralis.png +0 -0
- intentkit/skills/moralis/schema.json +156 -0
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +511 -0
- intentkit/skills/nation/__init__.py +62 -0
- intentkit/skills/nation/base.py +31 -0
- intentkit/skills/nation/nation.png +0 -0
- intentkit/skills/nation/nft_check.py +106 -0
- intentkit/skills/nation/schema.json +58 -0
- intentkit/skills/openai/__init__.py +107 -0
- intentkit/skills/openai/base.py +32 -0
- intentkit/skills/openai/dalle_image_generation.py +128 -0
- intentkit/skills/openai/gpt_image_generation.py +152 -0
- intentkit/skills/openai/gpt_image_to_image.py +186 -0
- intentkit/skills/openai/image_to_text.py +126 -0
- intentkit/skills/openai/openai.png +0 -0
- intentkit/skills/openai/schema.json +139 -0
- intentkit/skills/portfolio/README.md +55 -0
- intentkit/skills/portfolio/__init__.py +151 -0
- intentkit/skills/portfolio/base.py +107 -0
- intentkit/skills/portfolio/constants.py +9 -0
- intentkit/skills/portfolio/moralis.png +0 -0
- intentkit/skills/portfolio/schema.json +237 -0
- intentkit/skills/portfolio/token_balances.py +155 -0
- intentkit/skills/portfolio/wallet_approvals.py +102 -0
- intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
- intentkit/skills/portfolio/wallet_history.py +155 -0
- intentkit/skills/portfolio/wallet_net_worth.py +112 -0
- intentkit/skills/portfolio/wallet_nfts.py +139 -0
- intentkit/skills/portfolio/wallet_profitability.py +101 -0
- intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
- intentkit/skills/portfolio/wallet_stats.py +79 -0
- intentkit/skills/portfolio/wallet_swaps.py +147 -0
- intentkit/skills/skills.toml +103 -0
- intentkit/skills/slack/__init__.py +98 -0
- intentkit/skills/slack/base.py +55 -0
- intentkit/skills/slack/get_channel.py +109 -0
- intentkit/skills/slack/get_message.py +136 -0
- intentkit/skills/slack/schedule_message.py +92 -0
- intentkit/skills/slack/schema.json +135 -0
- intentkit/skills/slack/send_message.py +81 -0
- intentkit/skills/slack/slack.jpg +0 -0
- intentkit/skills/system/__init__.py +90 -0
- intentkit/skills/system/base.py +22 -0
- intentkit/skills/system/read_agent_api_key.py +87 -0
- intentkit/skills/system/regenerate_agent_api_key.py +77 -0
- intentkit/skills/system/schema.json +53 -0
- intentkit/skills/system/system.svg +76 -0
- intentkit/skills/tavily/README.md +86 -0
- intentkit/skills/tavily/__init__.py +91 -0
- intentkit/skills/tavily/base.py +27 -0
- intentkit/skills/tavily/schema.json +119 -0
- intentkit/skills/tavily/tavily.jpg +0 -0
- intentkit/skills/tavily/tavily_extract.py +147 -0
- intentkit/skills/tavily/tavily_search.py +139 -0
- intentkit/skills/token/README.md +89 -0
- intentkit/skills/token/__init__.py +107 -0
- intentkit/skills/token/base.py +154 -0
- intentkit/skills/token/constants.py +9 -0
- intentkit/skills/token/erc20_transfers.py +145 -0
- intentkit/skills/token/moralis.png +0 -0
- intentkit/skills/token/schema.json +141 -0
- intentkit/skills/token/token_analytics.py +81 -0
- intentkit/skills/token/token_price.py +132 -0
- intentkit/skills/token/token_search.py +121 -0
- intentkit/skills/twitter/__init__.py +146 -0
- intentkit/skills/twitter/base.py +68 -0
- intentkit/skills/twitter/follow_user.py +69 -0
- intentkit/skills/twitter/get_mentions.py +124 -0
- intentkit/skills/twitter/get_timeline.py +111 -0
- intentkit/skills/twitter/get_user_by_username.py +84 -0
- intentkit/skills/twitter/get_user_tweets.py +123 -0
- intentkit/skills/twitter/like_tweet.py +65 -0
- intentkit/skills/twitter/post_tweet.py +90 -0
- intentkit/skills/twitter/reply_tweet.py +98 -0
- intentkit/skills/twitter/retweet.py +76 -0
- intentkit/skills/twitter/schema.json +258 -0
- intentkit/skills/twitter/search_tweets.py +115 -0
- intentkit/skills/twitter/twitter.png +0 -0
- intentkit/skills/unrealspeech/__init__.py +55 -0
- intentkit/skills/unrealspeech/base.py +21 -0
- intentkit/skills/unrealspeech/schema.json +100 -0
- intentkit/skills/unrealspeech/text_to_speech.py +177 -0
- intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
- intentkit/skills/venice_audio/__init__.py +106 -0
- intentkit/skills/venice_audio/base.py +119 -0
- intentkit/skills/venice_audio/input.py +41 -0
- intentkit/skills/venice_audio/schema.json +152 -0
- intentkit/skills/venice_audio/venice_audio.py +240 -0
- intentkit/skills/venice_audio/venice_logo.jpg +0 -0
- intentkit/skills/venice_image/README.md +119 -0
- intentkit/skills/venice_image/__init__.py +154 -0
- intentkit/skills/venice_image/api.py +138 -0
- intentkit/skills/venice_image/base.py +188 -0
- intentkit/skills/venice_image/config.py +35 -0
- intentkit/skills/venice_image/image_enhance/README.md +119 -0
- intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
- intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
- intentkit/skills/venice_image/image_generation/README.md +144 -0
- intentkit/skills/venice_image/image_generation/__init__.py +0 -0
- intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
- intentkit/skills/venice_image/image_upscale/README.md +111 -0
- intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
- intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
- intentkit/skills/venice_image/image_vision/README.md +112 -0
- intentkit/skills/venice_image/image_vision/__init__.py +0 -0
- intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
- intentkit/skills/venice_image/schema.json +267 -0
- intentkit/skills/venice_image/utils.py +78 -0
- intentkit/skills/venice_image/venice_image.jpg +0 -0
- intentkit/skills/web_scraper/README.md +82 -0
- intentkit/skills/web_scraper/__init__.py +92 -0
- intentkit/skills/web_scraper/base.py +21 -0
- intentkit/skills/web_scraper/langchain.png +0 -0
- intentkit/skills/web_scraper/schema.json +115 -0
- intentkit/skills/web_scraper/scrape_and_index.py +327 -0
- intentkit/utils/__init__.py +1 -0
- intentkit/utils/chain.py +436 -0
- intentkit/utils/error.py +134 -0
- intentkit/utils/logging.py +70 -0
- intentkit/utils/middleware.py +61 -0
- intentkit/utils/random.py +16 -0
- intentkit/utils/s3.py +267 -0
- intentkit/utils/slack_alert.py +79 -0
- intentkit/utils/tx.py +37 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
- intentkit-0.5.2.dist-info/RECORD +365 -0
- intentkit-0.5.0.dist-info/RECORD +0 -4
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
from typing import Type
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
from langchain.tools.base import ToolException
|
|
5
|
+
from langchain_core.runnables import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from .base import ElfaBaseTool, base_url
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ElfaGetSmartStatsInput(BaseModel):
|
|
12
|
+
username: str = Field(description="username to get stats for")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SmartStatsData(BaseModel):
|
|
16
|
+
followerEngagementRatio: float | None = Field(
|
|
17
|
+
description="the ratio of engagement by followers"
|
|
18
|
+
)
|
|
19
|
+
averageEngagement: float | None = Field(
|
|
20
|
+
description="the average engagement of acount"
|
|
21
|
+
)
|
|
22
|
+
smartFollowingCount: float | None = Field(
|
|
23
|
+
description="the count of smart followings"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ElfaGetSmartStatsOutput(BaseModel):
|
|
28
|
+
success: bool
|
|
29
|
+
data: SmartStatsData | None = Field(None, description="The stats data")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ElfaGetSmartStats(ElfaBaseTool):
|
|
33
|
+
"""
|
|
34
|
+
This tool uses the Elfa API to retrieve key social media metrics for a given username. These metrics include:
|
|
35
|
+
|
|
36
|
+
* **Smart Following Count:** A metric representing the number of high-quality or influential followers.
|
|
37
|
+
* **Engagement Score:** A composite score reflecting the level of interaction with the user's content.
|
|
38
|
+
* **Engagement Ratio:** The ratio of engagement (likes, comments, shares) to the number of followers.
|
|
39
|
+
|
|
40
|
+
This tool is useful for:
|
|
41
|
+
|
|
42
|
+
* **Competitor Analysis:** Compare your social media performance to that of your competitors.
|
|
43
|
+
* **Influencer Identification:** Identify influential users in your niche.
|
|
44
|
+
* **Social Media Audits:** Assess the overall health and effectiveness of a social media presence.
|
|
45
|
+
|
|
46
|
+
To use this tool, simply provide the desired username. The tool will return the requested metrics.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
name (str): Name of the tool, specifically "elfa_get_smart_stats".
|
|
50
|
+
description (str): Comprehensive description of the tool's purpose and functionality.
|
|
51
|
+
args_schema (Type[BaseModel]): Schema for input arguments, specifying expected parameters.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
name: str = "elfa_get_smart_stats"
|
|
55
|
+
description: str = """This tool uses the Elfa API to retrieve key social media metrics for a given username. These metrics include:
|
|
56
|
+
|
|
57
|
+
* **Smart Following Count:** A metric representing the number of high-quality or influential followers.
|
|
58
|
+
* **Engagement Score:** A composite score reflecting the level of interaction with the user's content.
|
|
59
|
+
* **Engagement Ratio:** The ratio of engagement (likes, comments, shares) to the number of followers.
|
|
60
|
+
|
|
61
|
+
This tool is useful for:
|
|
62
|
+
|
|
63
|
+
* **Competitor Analysis:** Compare your social media performance to that of your competitors.
|
|
64
|
+
* **Influencer Identification:** Identify influential users in your niche.
|
|
65
|
+
* **Social Media Audits:** Assess the overall health and effectiveness of a social media presence.
|
|
66
|
+
"""
|
|
67
|
+
args_schema: Type[BaseModel] = ElfaGetSmartStatsInput
|
|
68
|
+
|
|
69
|
+
async def _arun(
|
|
70
|
+
self, username: str, config: RunnableConfig, **kwargs
|
|
71
|
+
) -> ElfaGetSmartStatsOutput:
|
|
72
|
+
"""Run the tool retrieve smart stats (smart following count) and social metrics (engagement score and ratio) for a given username.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
username (str): The username to check stats for.
|
|
76
|
+
config: The configuration for the runnable, containing agent context.
|
|
77
|
+
**kwargs: Additional parameters.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
ElfaGetSmartStatsOutput: A structured output containing output of Elfa get mentions API.
|
|
81
|
+
|
|
82
|
+
Raises:
|
|
83
|
+
Exception: If there's an error accessing the Elfa API.
|
|
84
|
+
"""
|
|
85
|
+
context = self.context_from_config(config)
|
|
86
|
+
api_key = self.get_api_key(context)
|
|
87
|
+
if not api_key:
|
|
88
|
+
raise ValueError("Elfa API key not found")
|
|
89
|
+
|
|
90
|
+
url = f"{base_url}/v1/account/smart-stats"
|
|
91
|
+
headers = {
|
|
92
|
+
"accept": "application/json",
|
|
93
|
+
"x-elfa-api-key": api_key,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
params = ElfaGetSmartStatsInput(username=username).model_dump(exclude_none=True)
|
|
97
|
+
|
|
98
|
+
async with httpx.AsyncClient() as client:
|
|
99
|
+
try:
|
|
100
|
+
response = await client.get(
|
|
101
|
+
url, headers=headers, timeout=30, params=params
|
|
102
|
+
)
|
|
103
|
+
response.raise_for_status()
|
|
104
|
+
json_dict = response.json()
|
|
105
|
+
|
|
106
|
+
res = ElfaGetSmartStatsOutput(**json_dict)
|
|
107
|
+
|
|
108
|
+
return res
|
|
109
|
+
except httpx.RequestError as req_err:
|
|
110
|
+
raise ToolException(
|
|
111
|
+
f"request error from Elfa API: {req_err}"
|
|
112
|
+
) from req_err
|
|
113
|
+
except httpx.HTTPStatusError as http_err:
|
|
114
|
+
raise ToolException(
|
|
115
|
+
f"http error from Elfa API: {http_err}"
|
|
116
|
+
) from http_err
|
|
117
|
+
except Exception as e:
|
|
118
|
+
raise ToolException(f"error from Elfa API: {e}") from e
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from typing import Type
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
from langchain.tools.base import ToolException
|
|
5
|
+
from langchain_core.runnables import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from .base import ElfaBaseTool, base_url
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ElfaGetTrendingTokensInput(BaseModel):
|
|
12
|
+
timeWindow: str | None = Field(
|
|
13
|
+
"24h", description="Time window for trending analysis"
|
|
14
|
+
)
|
|
15
|
+
minMentions: int | None = Field(
|
|
16
|
+
5, description="Minimum number of mentions required"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Trends(BaseModel):
|
|
21
|
+
change_percent: int | None = Field(description="change percentage of token trend")
|
|
22
|
+
previous_count: int | None = Field(description="previous count")
|
|
23
|
+
current_count: int | None = Field(description="current count")
|
|
24
|
+
token: str | None = Field(description="token")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TrendsData(BaseModel):
|
|
28
|
+
data: list[Trends] | None = Field(None, description="trending tokens")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ElfaGetTrendingTokensOutput(BaseModel):
|
|
32
|
+
success: bool
|
|
33
|
+
data: TrendsData | None = Field(None, description="The result")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ElfaGetTrendingTokens(ElfaBaseTool):
|
|
37
|
+
"""
|
|
38
|
+
This tool ranks the most discussed tokens based on smart mentions count for a given period, with updates every 5 minutes via the Elfa API. Smart mentions provide a more sophisticated measure of discussion volume than simple keyword counts.
|
|
39
|
+
|
|
40
|
+
**Use Cases:**
|
|
41
|
+
|
|
42
|
+
* Identify trending tokens: Quickly see which tokens are gaining traction in online discussions.
|
|
43
|
+
* Gauge market sentiment: Track changes in smart mention counts to understand shifts in market opinion.
|
|
44
|
+
* Research potential investments: Use the ranking as a starting point for further due diligence.
|
|
45
|
+
|
|
46
|
+
**Example Usage:**
|
|
47
|
+
|
|
48
|
+
To use this tool, you would typically specify a time window (e.g., the last hour, the last 24 hours). The tool will then return a ranked list of tokens, along with their corresponding smart mention counts.
|
|
49
|
+
|
|
50
|
+
Attributes:
|
|
51
|
+
name (str): Name of the tool, specifically "elfa_get_trending_tokens".
|
|
52
|
+
description (str): Comprehensive description of the tool's purpose and functionality.
|
|
53
|
+
args_schema (Type[BaseModel]): Schema for input arguments, specifying expected parameters.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
name: str = "elfa_get_trending_tokens"
|
|
57
|
+
description: str = """This tool ranks the most discussed tokens based on smart mentions count for a given period, with updates every 5 minutes via the Elfa API. Smart mentions provide a more sophisticated measure of discussion volume than simple keyword counts.
|
|
58
|
+
|
|
59
|
+
**Use Cases:**
|
|
60
|
+
|
|
61
|
+
* Identify trending tokens: Quickly see which tokens are gaining traction in online discussions.
|
|
62
|
+
* Gauge market sentiment: Track changes in smart mention counts to understand shifts in market opinion.
|
|
63
|
+
* Research potential investments: Use the ranking as a starting point for further due diligence.
|
|
64
|
+
|
|
65
|
+
**Example Usage:**
|
|
66
|
+
|
|
67
|
+
To use this tool, you would typically specify a time window (e.g., the last hour, the last 24 hours). The tool will then return a ranked list of tokens, along with their corresponding smart mention counts."""
|
|
68
|
+
args_schema: Type[BaseModel] = ElfaGetTrendingTokensInput
|
|
69
|
+
|
|
70
|
+
async def _arun(
|
|
71
|
+
self,
|
|
72
|
+
timeWindow: str = "24h",
|
|
73
|
+
minMentions: int = 5,
|
|
74
|
+
config: RunnableConfig = None,
|
|
75
|
+
**kwargs,
|
|
76
|
+
) -> ElfaGetTrendingTokensOutput:
|
|
77
|
+
"""Run the tool to ranks the most discussed tokens by smart mentions count for a given period, updated every 5 minutes via the Elfa API.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
timeWindow: Time window for trending tokens (e.g., '1h', '24h', '7d').
|
|
81
|
+
minMentions: Minimum number of mentions for a token.
|
|
82
|
+
config: The configuration for the runnable, containing agent context.
|
|
83
|
+
**kwargs: Additional parameters.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
ElfaGetMentionsOutput: A structured output containing output of Elfa get mentions API.
|
|
87
|
+
|
|
88
|
+
Raises:
|
|
89
|
+
Exception: If there's an error accessing the Elfa API.
|
|
90
|
+
"""
|
|
91
|
+
context = self.context_from_config(config)
|
|
92
|
+
api_key = self.get_api_key(context)
|
|
93
|
+
if not api_key:
|
|
94
|
+
raise ValueError("Elfa API key not found")
|
|
95
|
+
|
|
96
|
+
url = f"{base_url}/v1/trending-tokens"
|
|
97
|
+
headers = {
|
|
98
|
+
"accept": "application/json",
|
|
99
|
+
"x-elfa-api-key": api_key,
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
params = ElfaGetTrendingTokensInput(
|
|
103
|
+
timeWindow=timeWindow, page=1, pageSize=50, minMentions=minMentions
|
|
104
|
+
).model_dump(exclude_none=True)
|
|
105
|
+
|
|
106
|
+
async with httpx.AsyncClient() as client:
|
|
107
|
+
try:
|
|
108
|
+
response = await client.get(
|
|
109
|
+
url, headers=headers, timeout=30, params=params
|
|
110
|
+
)
|
|
111
|
+
response.raise_for_status()
|
|
112
|
+
json_dict = response.json()
|
|
113
|
+
|
|
114
|
+
res = ElfaGetTrendingTokensOutput(**json_dict)
|
|
115
|
+
|
|
116
|
+
return res
|
|
117
|
+
except httpx.RequestError as req_err:
|
|
118
|
+
raise ToolException(
|
|
119
|
+
f"request error from Elfa API: {req_err}"
|
|
120
|
+
) from req_err
|
|
121
|
+
except httpx.HTTPStatusError as http_err:
|
|
122
|
+
raise ToolException(
|
|
123
|
+
f"http error from Elfa API: {http_err}"
|
|
124
|
+
) from http_err
|
|
125
|
+
except Exception as e:
|
|
126
|
+
raise ToolException(f"error from Elfa API: {e}") from e
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Enso Finance Skills
|
|
2
|
+
|
|
3
|
+
Integration with Enso Finance API for DeFi protocols, portfolio management, and yield optimization.
|
|
4
|
+
|
|
5
|
+
## Skills
|
|
6
|
+
|
|
7
|
+
| Skill | Description |
|
|
8
|
+
|-------|-------------|
|
|
9
|
+
| `enso_get_networks` | List supported networks |
|
|
10
|
+
| `enso_get_tokens` | Get token info (APY, symbol, address) |
|
|
11
|
+
| `enso_get_prices` | Get token prices |
|
|
12
|
+
| `enso_get_wallet_balances` | Get wallet token balances |
|
|
13
|
+
| `enso_get_wallet_approvals` | Get token spend approvals |
|
|
14
|
+
| `enso_wallet_approve` | Broadcast approval transactions |
|
|
15
|
+
| `enso_route_shortcut` | Broadcast route transactions |
|
|
16
|
+
| `enso_get_best_yield` | Find best yield options across protocols |
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
# Agent configuration example
|
|
22
|
+
skills:
|
|
23
|
+
enso:
|
|
24
|
+
enabled: true
|
|
25
|
+
api_token: "${ENSO_API_TOKEN}" # Optional if set at system level
|
|
26
|
+
main_tokens: ["USDC", "ETH", "USDT"]
|
|
27
|
+
states:
|
|
28
|
+
get_networks: public
|
|
29
|
+
get_tokens: public
|
|
30
|
+
get_prices: public
|
|
31
|
+
get_best_yield: public
|
|
32
|
+
# Sensitive operations should be private or disabled
|
|
33
|
+
get_wallet_approvals: private
|
|
34
|
+
get_wallet_balances: private
|
|
35
|
+
wallet_approve: private
|
|
36
|
+
route_shortcut: disabled
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Get Best Yield Skill
|
|
40
|
+
|
|
41
|
+
Finds highest yield options for a token across protocols. Default: USDC on Base network.
|
|
42
|
+
|
|
43
|
+
### Parameters
|
|
44
|
+
|
|
45
|
+
- `token_symbol`: Token symbol (default: "USDC")
|
|
46
|
+
- `chain_id`: Blockchain network ID (default: 8453 for Base)
|
|
47
|
+
- `top_n`: Number of options to return (default: 5)
|
|
48
|
+
|
|
49
|
+
### Example
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
# Query: What are the best USDC yield options on Base?
|
|
53
|
+
|
|
54
|
+
# Response format:
|
|
55
|
+
{
|
|
56
|
+
"best_options": [
|
|
57
|
+
{
|
|
58
|
+
"protocol_name": "Protocol Name",
|
|
59
|
+
"token_name": "Token Name",
|
|
60
|
+
"apy": 12.5,
|
|
61
|
+
"tvl": 5000000,
|
|
62
|
+
"underlying_tokens": ["USDC"]
|
|
63
|
+
},
|
|
64
|
+
// Additional results...
|
|
65
|
+
],
|
|
66
|
+
"token_symbol": "USDC",
|
|
67
|
+
"chain_name": "Base"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The skill fetches protocols, retrieves token data, filters for the target token, and sorts by APY.
|
|
72
|
+
|
|
73
|
+
## Authentication
|
|
74
|
+
|
|
75
|
+
Requires an Enso API token in agent config or system config.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Enso skills."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import List, NotRequired, TypedDict
|
|
5
|
+
|
|
6
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
|
+
from intentkit.skills.base import SkillConfig, SkillState
|
|
8
|
+
from intentkit.skills.enso.base import EnsoBaseTool
|
|
9
|
+
from intentkit.skills.enso.best_yield import EnsoGetBestYield
|
|
10
|
+
from intentkit.skills.enso.networks import EnsoGetNetworks
|
|
11
|
+
from intentkit.skills.enso.prices import EnsoGetPrices
|
|
12
|
+
from intentkit.skills.enso.route import EnsoRouteShortcut
|
|
13
|
+
from intentkit.skills.enso.tokens import EnsoGetTokens
|
|
14
|
+
from intentkit.skills.enso.wallet import (
|
|
15
|
+
EnsoGetWalletApprovals,
|
|
16
|
+
EnsoGetWalletBalances,
|
|
17
|
+
EnsoWalletApprove,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SkillStates(TypedDict):
|
|
24
|
+
get_networks: SkillState
|
|
25
|
+
get_tokens: SkillState
|
|
26
|
+
get_prices: SkillState
|
|
27
|
+
get_wallet_approvals: SkillState
|
|
28
|
+
get_wallet_balances: SkillState
|
|
29
|
+
wallet_approve: SkillState
|
|
30
|
+
route_shortcut: SkillState
|
|
31
|
+
get_best_yield: SkillState
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Config(SkillConfig):
|
|
35
|
+
"""Configuration for Enso skills."""
|
|
36
|
+
|
|
37
|
+
states: SkillStates
|
|
38
|
+
api_token: NotRequired[str]
|
|
39
|
+
main_tokens: List[str]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
async def get_skills(
|
|
43
|
+
config: Config,
|
|
44
|
+
is_private: bool,
|
|
45
|
+
store: SkillStoreABC,
|
|
46
|
+
**_,
|
|
47
|
+
) -> list[EnsoBaseTool]:
|
|
48
|
+
"""Get all Enso skills."""
|
|
49
|
+
available_skills = []
|
|
50
|
+
|
|
51
|
+
# Include skills based on their state
|
|
52
|
+
for skill_name, state in config["states"].items():
|
|
53
|
+
if state == "disabled":
|
|
54
|
+
continue
|
|
55
|
+
elif state == "public" or (state == "private" and is_private):
|
|
56
|
+
available_skills.append(skill_name)
|
|
57
|
+
|
|
58
|
+
# Get each skill using the cached getter
|
|
59
|
+
result = []
|
|
60
|
+
for name in available_skills:
|
|
61
|
+
skill = get_enso_skill(name, store)
|
|
62
|
+
if skill:
|
|
63
|
+
result.append(skill)
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def get_enso_skill(
|
|
68
|
+
name: str,
|
|
69
|
+
skill_store: SkillStoreABC,
|
|
70
|
+
) -> EnsoBaseTool:
|
|
71
|
+
"""Get an Enso skill by name.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
name: The name of the skill to get
|
|
75
|
+
skill_store: The skill store for persisting data
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
The requested Enso skill
|
|
79
|
+
"""
|
|
80
|
+
if name == "get_networks":
|
|
81
|
+
return EnsoGetNetworks(
|
|
82
|
+
skill_store=skill_store,
|
|
83
|
+
)
|
|
84
|
+
if name == "get_tokens":
|
|
85
|
+
return EnsoGetTokens(
|
|
86
|
+
skill_store=skill_store,
|
|
87
|
+
)
|
|
88
|
+
if name == "get_prices":
|
|
89
|
+
return EnsoGetPrices(
|
|
90
|
+
skill_store=skill_store,
|
|
91
|
+
)
|
|
92
|
+
if name == "get_wallet_approvals":
|
|
93
|
+
return EnsoGetWalletApprovals(
|
|
94
|
+
skill_store=skill_store,
|
|
95
|
+
)
|
|
96
|
+
if name == "get_wallet_balances":
|
|
97
|
+
return EnsoGetWalletBalances(
|
|
98
|
+
skill_store=skill_store,
|
|
99
|
+
)
|
|
100
|
+
if name == "wallet_approve":
|
|
101
|
+
return EnsoWalletApprove(
|
|
102
|
+
skill_store=skill_store,
|
|
103
|
+
)
|
|
104
|
+
if name == "route_shortcut":
|
|
105
|
+
return EnsoRouteShortcut(
|
|
106
|
+
skill_store=skill_store,
|
|
107
|
+
)
|
|
108
|
+
if name == "get_best_yield":
|
|
109
|
+
return EnsoGetBestYield(
|
|
110
|
+
skill_store=skill_store,
|
|
111
|
+
)
|
|
112
|
+
else:
|
|
113
|
+
logger.warning(f"Unknown Enso skill: {name}")
|
|
114
|
+
return None
|
|
File without changes
|