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
intentkit/models/user.py
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from decimal import Decimal
|
|
4
|
+
from typing import Annotated, Optional
|
|
5
|
+
|
|
6
|
+
from intentkit.models.base import Base
|
|
7
|
+
from intentkit.models.credit import CreditAccount
|
|
8
|
+
from intentkit.models.db import get_session
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
10
|
+
from sqlalchemy import Column, DateTime, Index, Integer, String, func, select
|
|
11
|
+
from sqlalchemy.dialects.postgresql import JSON, JSONB
|
|
12
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UserTable(Base):
|
|
18
|
+
"""User database table model."""
|
|
19
|
+
|
|
20
|
+
__tablename__ = "users"
|
|
21
|
+
__table_args__ = (
|
|
22
|
+
Index("ix_users_x_username", "x_username"),
|
|
23
|
+
Index("ix_users_telegram_username", "telegram_username"),
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
id = Column(
|
|
27
|
+
String,
|
|
28
|
+
primary_key=True,
|
|
29
|
+
)
|
|
30
|
+
nft_count = Column(
|
|
31
|
+
Integer,
|
|
32
|
+
default=0,
|
|
33
|
+
nullable=False,
|
|
34
|
+
)
|
|
35
|
+
email = Column(
|
|
36
|
+
String,
|
|
37
|
+
nullable=True,
|
|
38
|
+
)
|
|
39
|
+
x_username = Column(
|
|
40
|
+
String,
|
|
41
|
+
nullable=True,
|
|
42
|
+
)
|
|
43
|
+
github_username = Column(
|
|
44
|
+
String,
|
|
45
|
+
nullable=True,
|
|
46
|
+
)
|
|
47
|
+
telegram_username = Column(
|
|
48
|
+
String,
|
|
49
|
+
nullable=True,
|
|
50
|
+
)
|
|
51
|
+
extra = Column(
|
|
52
|
+
JSON().with_variant(JSONB(), "postgresql"),
|
|
53
|
+
nullable=True,
|
|
54
|
+
)
|
|
55
|
+
created_at = Column(
|
|
56
|
+
DateTime(timezone=True),
|
|
57
|
+
nullable=False,
|
|
58
|
+
server_default=func.now(),
|
|
59
|
+
)
|
|
60
|
+
updated_at = Column(
|
|
61
|
+
DateTime(timezone=True),
|
|
62
|
+
nullable=False,
|
|
63
|
+
server_default=func.now(),
|
|
64
|
+
onupdate=lambda: datetime.now(timezone.utc),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class UserUpdate(BaseModel):
|
|
69
|
+
"""User update model without id and timestamps."""
|
|
70
|
+
|
|
71
|
+
model_config = ConfigDict(
|
|
72
|
+
from_attributes=True,
|
|
73
|
+
json_encoders={
|
|
74
|
+
datetime: lambda v: v.isoformat(timespec="milliseconds"),
|
|
75
|
+
},
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
nft_count: Annotated[
|
|
79
|
+
int, Field(default=0, description="Number of NFTs owned by the user")
|
|
80
|
+
]
|
|
81
|
+
email: Annotated[Optional[str], Field(None, description="User's email address")]
|
|
82
|
+
x_username: Annotated[
|
|
83
|
+
Optional[str], Field(None, description="User's X (Twitter) username")
|
|
84
|
+
]
|
|
85
|
+
github_username: Annotated[
|
|
86
|
+
Optional[str], Field(None, description="User's GitHub username")
|
|
87
|
+
]
|
|
88
|
+
telegram_username: Annotated[
|
|
89
|
+
Optional[str], Field(None, description="User's Telegram username")
|
|
90
|
+
]
|
|
91
|
+
extra: Annotated[
|
|
92
|
+
Optional[dict], Field(None, description="Additional user information")
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
async def _update_quota_for_nft_count(
|
|
96
|
+
self, db: AsyncSession, id: str, new_nft_count: int
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Update user's daily quota based on NFT count.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
db: Database session
|
|
102
|
+
id: User ID
|
|
103
|
+
new_nft_count: Current NFT count
|
|
104
|
+
"""
|
|
105
|
+
# Generate upstream_tx_id
|
|
106
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S")
|
|
107
|
+
upstream_tx_id = f"nft_{id}_{timestamp}"
|
|
108
|
+
|
|
109
|
+
# Calculate new quota values based on nft_count
|
|
110
|
+
free_quota = Decimal(480 + 48 * new_nft_count)
|
|
111
|
+
refill_amount = Decimal(20 + 2 * new_nft_count)
|
|
112
|
+
note = f"NFT count changed to {new_nft_count}"
|
|
113
|
+
|
|
114
|
+
# Update daily quota
|
|
115
|
+
logger.info(
|
|
116
|
+
f"Updating daily quota for user {id} due to NFT count change to {new_nft_count}"
|
|
117
|
+
)
|
|
118
|
+
await CreditAccount.update_daily_quota(
|
|
119
|
+
db,
|
|
120
|
+
id,
|
|
121
|
+
free_quota=free_quota,
|
|
122
|
+
refill_amount=refill_amount,
|
|
123
|
+
upstream_tx_id=upstream_tx_id,
|
|
124
|
+
note=note,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
async def patch(self, id: str) -> "User":
|
|
128
|
+
"""Update only the provided fields of a user in the database.
|
|
129
|
+
If the user doesn't exist, create a new one with the provided ID and fields.
|
|
130
|
+
If nft_count changes, update the daily quota accordingly.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
id: ID of the user to update or create
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
Updated or newly created User model
|
|
137
|
+
"""
|
|
138
|
+
async with get_session() as db:
|
|
139
|
+
db_user = await db.get(UserTable, id)
|
|
140
|
+
old_nft_count = 0 # Default for new users
|
|
141
|
+
|
|
142
|
+
if not db_user:
|
|
143
|
+
# Create new user if it doesn't exist
|
|
144
|
+
db_user = UserTable(id=id)
|
|
145
|
+
db.add(db_user)
|
|
146
|
+
else:
|
|
147
|
+
old_nft_count = db_user.nft_count
|
|
148
|
+
|
|
149
|
+
# Update only the fields that were provided
|
|
150
|
+
update_data = self.model_dump(exclude_unset=True)
|
|
151
|
+
for key, value in update_data.items():
|
|
152
|
+
setattr(db_user, key, value)
|
|
153
|
+
|
|
154
|
+
# Check if nft_count has changed and is in the update data
|
|
155
|
+
if "nft_count" in update_data and old_nft_count != update_data["nft_count"]:
|
|
156
|
+
await self._update_quota_for_nft_count(db, id, update_data["nft_count"])
|
|
157
|
+
|
|
158
|
+
await db.commit()
|
|
159
|
+
await db.refresh(db_user)
|
|
160
|
+
|
|
161
|
+
return User.model_validate(db_user)
|
|
162
|
+
|
|
163
|
+
async def put(self, id: str) -> "User":
|
|
164
|
+
"""Replace all fields of a user in the database with the provided values.
|
|
165
|
+
If the user doesn't exist, create a new one with the provided ID and fields.
|
|
166
|
+
If nft_count changes, update the daily quota accordingly.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
id: ID of the user to update or create
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Updated or newly created User model
|
|
173
|
+
"""
|
|
174
|
+
async with get_session() as db:
|
|
175
|
+
db_user = await db.get(UserTable, id)
|
|
176
|
+
old_nft_count = 0 # Default for new users
|
|
177
|
+
|
|
178
|
+
if not db_user:
|
|
179
|
+
# Create new user if it doesn't exist
|
|
180
|
+
db_user = UserTable(id=id)
|
|
181
|
+
db.add(db_user)
|
|
182
|
+
else:
|
|
183
|
+
old_nft_count = db_user.nft_count
|
|
184
|
+
|
|
185
|
+
# Replace all fields with the provided values
|
|
186
|
+
for key, value in self.model_dump().items():
|
|
187
|
+
setattr(db_user, key, value)
|
|
188
|
+
|
|
189
|
+
# Check if nft_count has changed
|
|
190
|
+
if old_nft_count != self.nft_count:
|
|
191
|
+
await self._update_quota_for_nft_count(db, id, self.nft_count)
|
|
192
|
+
|
|
193
|
+
await db.commit()
|
|
194
|
+
await db.refresh(db_user)
|
|
195
|
+
|
|
196
|
+
return User.model_validate(db_user)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class User(UserUpdate):
|
|
200
|
+
"""User model with all fields including id and timestamps."""
|
|
201
|
+
|
|
202
|
+
id: Annotated[
|
|
203
|
+
str,
|
|
204
|
+
Field(description="Unique identifier for the user"),
|
|
205
|
+
]
|
|
206
|
+
created_at: Annotated[
|
|
207
|
+
datetime, Field(description="Timestamp when this user was created")
|
|
208
|
+
]
|
|
209
|
+
updated_at: Annotated[
|
|
210
|
+
datetime, Field(description="Timestamp when this user was last updated")
|
|
211
|
+
]
|
|
212
|
+
|
|
213
|
+
@classmethod
|
|
214
|
+
async def get(cls, user_id: str) -> Optional["User"]:
|
|
215
|
+
"""Get a user by ID.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
user_id: ID of the user to get
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
User model or None if not found
|
|
222
|
+
"""
|
|
223
|
+
async with get_session() as session:
|
|
224
|
+
return await cls.get_in_session(session, user_id)
|
|
225
|
+
|
|
226
|
+
@classmethod
|
|
227
|
+
async def get_in_session(
|
|
228
|
+
cls, session: AsyncSession, user_id: str
|
|
229
|
+
) -> Optional["User"]:
|
|
230
|
+
"""Get a user by ID using the provided session.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
session: Database session
|
|
234
|
+
user_id: ID of the user to get
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
User model or None if not found
|
|
238
|
+
"""
|
|
239
|
+
result = await session.execute(select(UserTable).where(UserTable.id == user_id))
|
|
240
|
+
user = result.scalars().first()
|
|
241
|
+
if user is None:
|
|
242
|
+
return None
|
|
243
|
+
return cls.model_validate(user)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pkgutil
|
|
3
|
+
|
|
4
|
+
# Get the directory containing this __init__.py file
|
|
5
|
+
package_dir = os.path.dirname(__file__)
|
|
6
|
+
|
|
7
|
+
# Discover all modules in the skills directory
|
|
8
|
+
__all__ = [
|
|
9
|
+
name
|
|
10
|
+
for _, name, _ in pkgutil.iter_modules([package_dir])
|
|
11
|
+
if not name.startswith("_") and not name == "base"
|
|
12
|
+
]
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Acolyt skill module."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import NotRequired, TypedDict
|
|
5
|
+
|
|
6
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
|
+
from intentkit.skills.acolyt.ask import AcolytAskGpt
|
|
8
|
+
from intentkit.skills.acolyt.base import AcolytBaseTool
|
|
9
|
+
from intentkit.skills.base import SkillConfig, SkillState
|
|
10
|
+
|
|
11
|
+
# Cache skills at the system level, because they are stateless
|
|
12
|
+
_cache: dict[str, AcolytBaseTool] = {}
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SkillStates(TypedDict):
|
|
18
|
+
ask_gpt: SkillState
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Config(SkillConfig):
|
|
22
|
+
"""Configuration for Acolyt skills."""
|
|
23
|
+
|
|
24
|
+
states: SkillStates
|
|
25
|
+
api_key: NotRequired[str]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def get_skills(
|
|
29
|
+
config: "Config",
|
|
30
|
+
is_private: bool,
|
|
31
|
+
store: SkillStoreABC,
|
|
32
|
+
**_,
|
|
33
|
+
) -> list[AcolytBaseTool]:
|
|
34
|
+
"""Get all Acolyt skills.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
config: The configuration for Acolyt skills.
|
|
38
|
+
is_private: Whether to include private skills.
|
|
39
|
+
store: The skill store for persisting data.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
A list of Acolyt skills.
|
|
43
|
+
"""
|
|
44
|
+
available_skills = []
|
|
45
|
+
|
|
46
|
+
# Include skills based on their state
|
|
47
|
+
for skill_name, state in config["states"].items():
|
|
48
|
+
if state == "disabled":
|
|
49
|
+
continue
|
|
50
|
+
elif state == "public" or (state == "private" and is_private):
|
|
51
|
+
available_skills.append(skill_name)
|
|
52
|
+
|
|
53
|
+
# Get each skill using the cached getter
|
|
54
|
+
result = []
|
|
55
|
+
for name in available_skills:
|
|
56
|
+
skill = get_acolyt_skill(name, store)
|
|
57
|
+
if skill:
|
|
58
|
+
result.append(skill)
|
|
59
|
+
return result
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_acolyt_skill(
|
|
63
|
+
name: str,
|
|
64
|
+
store: SkillStoreABC,
|
|
65
|
+
) -> AcolytBaseTool | None:
|
|
66
|
+
"""Get an Acolyt skill by name.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
name: The name of the skill to get
|
|
70
|
+
store: The skill store for persisting data
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
The requested Acolyt skill
|
|
74
|
+
"""
|
|
75
|
+
if name == "ask_gpt":
|
|
76
|
+
if name not in _cache:
|
|
77
|
+
_cache[name] = AcolytAskGpt(
|
|
78
|
+
skill_store=store,
|
|
79
|
+
)
|
|
80
|
+
return _cache[name]
|
|
81
|
+
else:
|
|
82
|
+
logger.warning(f"Unknown Acolyt skill: {name}")
|
|
83
|
+
return None
|
|
Binary file
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Dict, Type
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from langchain_core.runnables import RunnableConfig
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from typing_extensions import Literal
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.acolyt.base import AcolytBaseTool
|
|
10
|
+
|
|
11
|
+
from .base import base_url
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class AcolytAskGptInput(BaseModel):
|
|
17
|
+
question: str
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class InputMessage(BaseModel):
|
|
21
|
+
role: Literal["system", "user", "assistant", "tool", "function"] = Field(
|
|
22
|
+
"user", description="The role of the message sender."
|
|
23
|
+
)
|
|
24
|
+
content: str
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class AcolytAskGptRequest(BaseModel):
|
|
28
|
+
messages: list[InputMessage]
|
|
29
|
+
model: str | None = Field("gpt-4o", description="The AI model to be used.")
|
|
30
|
+
stream: bool | None = Field(
|
|
31
|
+
False, description="To request for response of type stream."
|
|
32
|
+
)
|
|
33
|
+
temperature: float | None = Field(
|
|
34
|
+
0.7,
|
|
35
|
+
le=2,
|
|
36
|
+
ge=0,
|
|
37
|
+
description="Controls the degree of randomness in the generated text.",
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class AcolytAskGpt(AcolytBaseTool):
|
|
42
|
+
"""
|
|
43
|
+
The Acolyt Data Fetcher is a versatile LangChain tool designed to interact with the Acolyt chat API to retrieve insightful data
|
|
44
|
+
across various categories, including Twitter Metrics, Onchain Analysis, DEX & Trading, and Overall Metrics. This tool seamlessly
|
|
45
|
+
processes user queries, fetches relevant data from the Acolyt API, and returns concise, summarized responses for easy consumption.
|
|
46
|
+
|
|
47
|
+
Features:
|
|
48
|
+
- Twitter Metrics: Retrieve engagement metrics for specific Twitter accounts, Identify which AI agents have the highest count of smart followers, Display the best tweets from specified accounts, Compare the mindshare between different AI agents, Determine which agents have the highest impressions-to-followers ratio.
|
|
49
|
+
- Onchain Analysis: Fetch the current market capitalization for tokens, Show the distribution of top holders for tokens, Identify tokens with the highest whale concentration, Compare holder retention rates between tokens, Calculate the Herfindahl index for tokens, List tokens with large amount of holders.
|
|
50
|
+
- DEX & Trading: Get the 24-hour trading volume for tokens, Identify which DEX has the highest liquidity for tokens, Obtain the buy/sell ratio for tokens over specific time periods. Compare price changes across different timeframes for tokens. List trading pairs with over a value in liquidity for tokens.
|
|
51
|
+
- Overall Metrics: Identify projects with the highest smart engagement relative to their market cap, Determine which agents have the best mindshare relative to their market cap. Compare the percentage of smart followers across the top n AI agents by market cap
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
Attributes:
|
|
55
|
+
name (str): Name of the tool, specifically "acolyt_ask_gpt".
|
|
56
|
+
description (str): Comprehensive description of the tool's purpose and functionality.
|
|
57
|
+
args_schema (Type[BaseModel]): Schema for input arguments, specifying expected parameters.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
name: str = "acolyt_ask_gpt"
|
|
61
|
+
description: str = """
|
|
62
|
+
The Acolyt Data Fetcher is a LangChain tool accessing the Acolyt chat API for data across Twitter Metrics, Onchain Analysis, DEX & Trading, and Overall Metrics. It processes queries, fetches data, and returns summarized responses. Features include:
|
|
63
|
+
|
|
64
|
+
Twitter: Engagement metrics, top smart follower counts, best tweets, mindshare comparison, impressions/follower ratio.
|
|
65
|
+
Onchain: Market cap, holder distribution, whale concentration, holder retention, Herfindahl index, high holder count tokens.
|
|
66
|
+
DEX & Trading: 24h volume, top DEX liquidity, buy/sell ratio, price change comparison, high liquidity pairs.
|
|
67
|
+
Overall: Smart engagement/market cap ratio, mindshare/market cap ratio, smart follower percentage comparison across top AI agents.
|
|
68
|
+
"""
|
|
69
|
+
args_schema: Type[BaseModel] = AcolytAskGptInput
|
|
70
|
+
|
|
71
|
+
async def _arun(self, question: str, config: RunnableConfig, **kwargs) -> Dict:
|
|
72
|
+
"""Run the tool to get answer from Acolyt GPT.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
question (str): The question body from user.
|
|
76
|
+
config (RunnableConfig): The configuration for the runnable, containing agent context.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Dict: The response from the API with message content.
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
Exception: If there's an error accessing the Acolyt API.
|
|
83
|
+
"""
|
|
84
|
+
context = self.context_from_config(config)
|
|
85
|
+
api_key = self.get_api_key(context)
|
|
86
|
+
if not api_key:
|
|
87
|
+
raise ValueError("Acolyt API key not found")
|
|
88
|
+
|
|
89
|
+
url = f"{base_url}/api/chat/completions"
|
|
90
|
+
headers = {
|
|
91
|
+
"accept": "application/json",
|
|
92
|
+
"Authorization": f"Bearer {api_key}",
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
body = AcolytAskGptRequest(
|
|
96
|
+
messages=[InputMessage(content=question)],
|
|
97
|
+
).model_dump(exclude_none=True)
|
|
98
|
+
|
|
99
|
+
async with httpx.AsyncClient() as client:
|
|
100
|
+
try:
|
|
101
|
+
response = await client.post(
|
|
102
|
+
url, headers=headers, timeout=30, json=body
|
|
103
|
+
)
|
|
104
|
+
response.raise_for_status()
|
|
105
|
+
json_dict = response.json()
|
|
106
|
+
|
|
107
|
+
# Extract message content directly
|
|
108
|
+
if "choices" in json_dict and len(json_dict["choices"]) > 0:
|
|
109
|
+
if (
|
|
110
|
+
"message" in json_dict["choices"][0]
|
|
111
|
+
and "content" in json_dict["choices"][0]["message"]
|
|
112
|
+
):
|
|
113
|
+
return json_dict
|
|
114
|
+
else:
|
|
115
|
+
raise ValueError("Unexpected response format from Acolyt API")
|
|
116
|
+
else:
|
|
117
|
+
raise ValueError("Empty response from Acolyt API")
|
|
118
|
+
|
|
119
|
+
except httpx.RequestError as req_err:
|
|
120
|
+
raise ValueError(
|
|
121
|
+
f"Request error from Acolyt API: {req_err}"
|
|
122
|
+
) from req_err
|
|
123
|
+
except httpx.HTTPStatusError as http_err:
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"HTTP error from Acolyt API: {http_err}"
|
|
126
|
+
) from http_err
|
|
127
|
+
except Exception as e:
|
|
128
|
+
raise ValueError(f"Error from Acolyt API: {e}") from e
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from typing import Optional, Type
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
6
|
+
from intentkit.skills.base import IntentKitSkill, SkillContext
|
|
7
|
+
|
|
8
|
+
base_url = "https://acolyt-oracle-poc.vercel.app"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AcolytBaseTool(IntentKitSkill):
|
|
12
|
+
"""Base class for Acolyt tools."""
|
|
13
|
+
|
|
14
|
+
name: str = Field(description="The name of the tool")
|
|
15
|
+
description: str = Field(description="A description of what the tool does")
|
|
16
|
+
args_schema: Type[BaseModel]
|
|
17
|
+
skill_store: SkillStoreABC = Field(
|
|
18
|
+
description="The skill store for persisting data"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
def get_api_key(self, context: SkillContext) -> Optional[str]:
|
|
22
|
+
if "api_key" in context.config and context.config["api_key"]:
|
|
23
|
+
return context.config["api_key"]
|
|
24
|
+
return self.skill_store.get_system_config("acolyt_api_key")
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def category(self) -> str:
|
|
28
|
+
return "acolyt"
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Acolyt",
|
|
5
|
+
"description": "Integration with Acolyt Oracle providing blockchain oracle services for accessing and verifying off-chain data with secure API connections",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/acolyt/acolyt.jpg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Blockchain",
|
|
9
|
+
"Oracle"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"enabled": {
|
|
13
|
+
"type": "boolean",
|
|
14
|
+
"title": "Enabled",
|
|
15
|
+
"description": "Whether this skill is enabled",
|
|
16
|
+
"default": false
|
|
17
|
+
},
|
|
18
|
+
"states": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"properties": {
|
|
21
|
+
"ask_gpt": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"title": "Ask GPT",
|
|
24
|
+
"enum": [
|
|
25
|
+
"disabled",
|
|
26
|
+
"public",
|
|
27
|
+
"private"
|
|
28
|
+
],
|
|
29
|
+
"x-enum-title": [
|
|
30
|
+
"Disabled",
|
|
31
|
+
"Agent Owner + All Users",
|
|
32
|
+
"Agent Owner Only"
|
|
33
|
+
],
|
|
34
|
+
"description": "The Acolyt Data Fetcher is a LangChain tool accessing the Acolyt chat API for data across X Metrics, Onchain Analysis, DEX & Trading, and Overall Metrics. It processes queries, fetches data, and returns summarized responses. Features include:\n Twitter: Engagement metrics, top smart follower counts, best tweets, mindshare comparison, impressions/follower ratio.\n Onchain: Market cap, holder distribution, whale concentration, holder retention, Herfindahl index, high holder count tokens.\n DEX & Trading: 24h volume, top DEX liquidity, buy/sell ratio, price change comparison, high liquidity pairs.\n Overall: Smart engagement/market cap ratio, mindshare/market cap ratio, smart follower percentage comparison across top AI agents.",
|
|
35
|
+
"default": "disabled"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"description": "States for each Acolyt skill (disabled, public, or private)"
|
|
39
|
+
},
|
|
40
|
+
"api_key_provider": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"title": "API Key Provider",
|
|
43
|
+
"description": "Who provides the API key",
|
|
44
|
+
"enum": [
|
|
45
|
+
"platform",
|
|
46
|
+
"agent_owner"
|
|
47
|
+
],
|
|
48
|
+
"x-enum-title": [
|
|
49
|
+
"Nation Hosted",
|
|
50
|
+
"Owner Provided"
|
|
51
|
+
],
|
|
52
|
+
"default": "platform"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"required": [
|
|
56
|
+
"states",
|
|
57
|
+
"enabled"
|
|
58
|
+
],
|
|
59
|
+
"if": {
|
|
60
|
+
"properties": {
|
|
61
|
+
"api_key_provider": {
|
|
62
|
+
"const": "agent_owner"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"then": {
|
|
67
|
+
"properties": {
|
|
68
|
+
"api_key": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"title": "Acolyt API Key",
|
|
71
|
+
"x-sensitive": true,
|
|
72
|
+
"description": "Acolyt API key for authentication"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"if": {
|
|
76
|
+
"properties": {
|
|
77
|
+
"enabled": {
|
|
78
|
+
"const": true
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"then": {
|
|
83
|
+
"required": [
|
|
84
|
+
"api_key"
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"additionalProperties": true
|
|
89
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# AIXBT Skill
|
|
2
|
+
|
|
3
|
+
This skill provides access to cryptocurrency project data and analytics through the AIXBT API.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Search for cryptocurrency projects by name, ticker, or blockchain
|
|
8
|
+
- Get detailed analysis and information about crypto projects
|
|
9
|
+
- Filter projects by minimum score
|
|
10
|
+
- View recent project updates and developments
|
|
11
|
+
- Access project contact information and social media handles
|
|
12
|
+
- Special "alpha" trigger for direct access to crypto research
|
|
13
|
+
|
|
14
|
+
## Available Skills
|
|
15
|
+
|
|
16
|
+
### aixbt_projects
|
|
17
|
+
|
|
18
|
+
Searches for cryptocurrency projects and retrieves detailed information about them.
|
|
19
|
+
|
|
20
|
+
#### Special Trigger
|
|
21
|
+
|
|
22
|
+
This skill has a special trigger word: **"alpha"**
|
|
23
|
+
|
|
24
|
+
When a user mentions the word "alpha" anywhere in their message, the AIXBT skill will be automatically triggered. This works with phrases like:
|
|
25
|
+
- "Show me some alpha"
|
|
26
|
+
- "What's the latest alpha on crypto?"
|
|
27
|
+
- "Give me alpha on Bitcoin"
|
|
28
|
+
- "I'm looking for alpha in DeFi projects"
|
|
29
|
+
- Any other message containing the word "alpha"
|
|
30
|
+
|
|
31
|
+
This gives users a convenient way to access crypto research data just by mentioning "alpha" in their questions or requests.
|
|
32
|
+
|
|
33
|
+
#### Parameters
|
|
34
|
+
|
|
35
|
+
| Name | Type | Description | Required | Default |
|
|
36
|
+
|------|------|-------------|----------|---------|
|
|
37
|
+
| limit | integer | Number of projects to return (max 50) | No | 10 |
|
|
38
|
+
| name | string | Filter projects by name (case-insensitive regex match) | No | null |
|
|
39
|
+
| ticker | string | Filter projects by ticker symbol (case-insensitive match) | No | null |
|
|
40
|
+
| xHandle | string | Filter projects by X/Twitter handle | No | null |
|
|
41
|
+
| minScore | number | Minimum score threshold | No | null |
|
|
42
|
+
| chain | string | Filter projects by blockchain | No | null |
|
|
43
|
+
|
|
44
|
+
## Example Usage
|
|
45
|
+
|
|
46
|
+
### "Alpha" Trigger Examples
|
|
47
|
+
|
|
48
|
+
**User:** "Show me some alpha"
|
|
49
|
+
|
|
50
|
+
**Agent:** *Uses the aixbt_projects skill to search for trending cryptocurrency projects and provides comprehensive information about them.*
|
|
51
|
+
|
|
52
|
+
**User:** "What's the latest alpha on Bitcoin?"
|
|
53
|
+
|
|
54
|
+
**Agent:** *Uses the aixbt_projects skill to search specifically for Bitcoin and provides detailed information.*
|
|
55
|
+
|
|
56
|
+
### Standard Query
|
|
57
|
+
|
|
58
|
+
When a user asks about a cryptocurrency project:
|
|
59
|
+
|
|
60
|
+
**User:** "Tell me about the Bitcoin project"
|
|
61
|
+
|
|
62
|
+
**Agent:** *Uses the aixbt_projects skill to search for "bitcoin" and provides information including:*
|
|
63
|
+
- Project score and analysis
|
|
64
|
+
- Recent project updates
|
|
65
|
+
- Social media information
|
|
66
|
+
- Blockchain and token details
|
|
67
|
+
|
|
68
|
+
## Links
|
|
69
|
+
|
|
70
|
+
- [AIXBT Website](https://aixbt.tech/)
|
|
71
|
+
- [API Documentation](https://api.aixbt.tech/v1/docs/)
|