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
intentkit/models/user.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from datetime import
|
|
3
|
-
from decimal import Decimal
|
|
4
|
-
from typing import Annotated,
|
|
2
|
+
from datetime import UTC, datetime
|
|
3
|
+
from decimal import ROUND_HALF_UP, Decimal
|
|
4
|
+
from typing import Annotated, TypeVar
|
|
5
5
|
|
|
6
6
|
from intentkit.models.base import Base
|
|
7
7
|
from intentkit.models.credit import CreditAccount
|
|
@@ -13,7 +13,6 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
13
13
|
|
|
14
14
|
logger = logging.getLogger(__name__)
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
# TypeVar for User model constraint
|
|
18
17
|
UserModelType = TypeVar("UserModelType", bound="User")
|
|
19
18
|
UserTableType = TypeVar("UserTableType", bound="UserTable")
|
|
@@ -23,10 +22,10 @@ class UserRegistry:
|
|
|
23
22
|
"""Registry for extended model classes."""
|
|
24
23
|
|
|
25
24
|
def __init__(self):
|
|
26
|
-
self._user_table_class:
|
|
27
|
-
self._user_model_class:
|
|
25
|
+
self._user_table_class: type[UserTableType] | None = None
|
|
26
|
+
self._user_model_class: type[UserModelType] | None = None
|
|
28
27
|
|
|
29
|
-
def register_user_table(self, user_table_class:
|
|
28
|
+
def register_user_table(self, user_table_class: type[UserTableType]) -> None:
|
|
30
29
|
"""Register extended UserTable class.
|
|
31
30
|
|
|
32
31
|
Args:
|
|
@@ -34,11 +33,11 @@ class UserRegistry:
|
|
|
34
33
|
"""
|
|
35
34
|
self._user_table_class = user_table_class
|
|
36
35
|
|
|
37
|
-
def get_user_table_class(self) ->
|
|
36
|
+
def get_user_table_class(self) -> type[UserTableType]:
|
|
38
37
|
"""Get registered UserTable class or default."""
|
|
39
38
|
return self._user_table_class or UserTable
|
|
40
39
|
|
|
41
|
-
def register_user_model(self, user_model_class:
|
|
40
|
+
def register_user_model(self, user_model_class: type[UserModelType]) -> None:
|
|
42
41
|
"""Register extended UserModel class.
|
|
43
42
|
|
|
44
43
|
Args:
|
|
@@ -46,7 +45,7 @@ class UserRegistry:
|
|
|
46
45
|
"""
|
|
47
46
|
self._user_model_class = user_model_class
|
|
48
47
|
|
|
49
|
-
def get_user_model_class(self) ->
|
|
48
|
+
def get_user_model_class(self) -> type[UserModelType]:
|
|
50
49
|
"""Get registered UserModel class or default."""
|
|
51
50
|
return self._user_model_class or User
|
|
52
51
|
|
|
@@ -93,6 +92,18 @@ class UserTable(Base):
|
|
|
93
92
|
JSON().with_variant(JSONB(), "postgresql"),
|
|
94
93
|
nullable=True,
|
|
95
94
|
)
|
|
95
|
+
evm_wallet_address = Column(
|
|
96
|
+
String,
|
|
97
|
+
nullable=True,
|
|
98
|
+
)
|
|
99
|
+
solana_wallet_address = Column(
|
|
100
|
+
String,
|
|
101
|
+
nullable=True,
|
|
102
|
+
)
|
|
103
|
+
linked_accounts = Column(
|
|
104
|
+
JSON().with_variant(JSONB(), "postgresql"),
|
|
105
|
+
nullable=True,
|
|
106
|
+
)
|
|
96
107
|
created_at = Column(
|
|
97
108
|
DateTime(timezone=True),
|
|
98
109
|
nullable=False,
|
|
@@ -102,7 +113,7 @@ class UserTable(Base):
|
|
|
102
113
|
DateTime(timezone=True),
|
|
103
114
|
nullable=False,
|
|
104
115
|
server_default=func.now(),
|
|
105
|
-
onupdate=lambda: datetime.now(
|
|
116
|
+
onupdate=lambda: datetime.now(UTC),
|
|
106
117
|
)
|
|
107
118
|
|
|
108
119
|
|
|
@@ -119,18 +130,27 @@ class UserUpdate(BaseModel):
|
|
|
119
130
|
nft_count: Annotated[
|
|
120
131
|
int, Field(default=0, description="Number of NFTs owned by the user")
|
|
121
132
|
]
|
|
122
|
-
email: Annotated[
|
|
133
|
+
email: Annotated[str | None, Field(None, description="User's email address")]
|
|
123
134
|
x_username: Annotated[
|
|
124
|
-
|
|
135
|
+
str | None, Field(None, description="User's X (Twitter) username")
|
|
125
136
|
]
|
|
126
137
|
github_username: Annotated[
|
|
127
|
-
|
|
138
|
+
str | None, Field(None, description="User's GitHub username")
|
|
128
139
|
]
|
|
129
140
|
telegram_username: Annotated[
|
|
130
|
-
|
|
141
|
+
str | None, Field(None, description="User's Telegram username")
|
|
131
142
|
]
|
|
132
143
|
extra: Annotated[
|
|
133
|
-
|
|
144
|
+
dict | None, Field(None, description="Additional user information")
|
|
145
|
+
]
|
|
146
|
+
evm_wallet_address: Annotated[
|
|
147
|
+
str | None, Field(None, description="User's EVM wallet address")
|
|
148
|
+
]
|
|
149
|
+
solana_wallet_address: Annotated[
|
|
150
|
+
str | None, Field(None, description="User's Solana wallet address")
|
|
151
|
+
]
|
|
152
|
+
linked_accounts: Annotated[
|
|
153
|
+
dict | None, Field(None, description="User's linked accounts information")
|
|
134
154
|
]
|
|
135
155
|
|
|
136
156
|
async def _update_quota_for_nft_count(
|
|
@@ -144,12 +164,17 @@ class UserUpdate(BaseModel):
|
|
|
144
164
|
new_nft_count: Current NFT count
|
|
145
165
|
"""
|
|
146
166
|
# Generate upstream_tx_id
|
|
147
|
-
timestamp = datetime.now(
|
|
167
|
+
timestamp = datetime.now(UTC).strftime("%Y%m%d%H%M%S")
|
|
148
168
|
upstream_tx_id = f"nft_{id}_{timestamp}"
|
|
149
169
|
|
|
150
170
|
# Calculate new quota values based on nft_count
|
|
151
|
-
|
|
152
|
-
|
|
171
|
+
FOURPLACES = Decimal("0.0001")
|
|
172
|
+
free_quota = Decimal(480 + 48 * new_nft_count).quantize(
|
|
173
|
+
FOURPLACES, rounding=ROUND_HALF_UP
|
|
174
|
+
)
|
|
175
|
+
refill_amount = Decimal(20 + 2 * new_nft_count).quantize(
|
|
176
|
+
FOURPLACES, rounding=ROUND_HALF_UP
|
|
177
|
+
)
|
|
153
178
|
note = f"NFT count changed to {new_nft_count}"
|
|
154
179
|
|
|
155
180
|
# Update daily quota
|
|
@@ -165,7 +190,7 @@ class UserUpdate(BaseModel):
|
|
|
165
190
|
note=note,
|
|
166
191
|
)
|
|
167
192
|
|
|
168
|
-
async def patch(self, id: str) ->
|
|
193
|
+
async def patch(self, id: str) -> UserModelType:
|
|
169
194
|
"""Update only the provided fields of a user in the database.
|
|
170
195
|
If the user doesn't exist, create a new one with the provided ID and fields.
|
|
171
196
|
If nft_count changes, update the daily quota accordingly.
|
|
@@ -177,7 +202,9 @@ class UserUpdate(BaseModel):
|
|
|
177
202
|
Updated or newly created User model
|
|
178
203
|
"""
|
|
179
204
|
user_model_class = user_model_registry.get_user_model_class()
|
|
205
|
+
assert issubclass(user_model_class, User)
|
|
180
206
|
user_table_class = user_model_registry.get_user_table_class()
|
|
207
|
+
assert issubclass(user_table_class, UserTable)
|
|
181
208
|
async with get_session() as db:
|
|
182
209
|
db_user = await db.get(user_table_class, id)
|
|
183
210
|
old_nft_count = 0 # Default for new users
|
|
@@ -203,7 +230,7 @@ class UserUpdate(BaseModel):
|
|
|
203
230
|
|
|
204
231
|
return user_model_class.model_validate(db_user)
|
|
205
232
|
|
|
206
|
-
async def put(self, id: str) ->
|
|
233
|
+
async def put(self, id: str) -> UserModelType:
|
|
207
234
|
"""Replace all fields of a user in the database with the provided values.
|
|
208
235
|
If the user doesn't exist, create a new one with the provided ID and fields.
|
|
209
236
|
If nft_count changes, update the daily quota accordingly.
|
|
@@ -215,7 +242,9 @@ class UserUpdate(BaseModel):
|
|
|
215
242
|
Updated or newly created User model
|
|
216
243
|
"""
|
|
217
244
|
user_model_class = user_model_registry.get_user_model_class()
|
|
245
|
+
assert issubclass(user_model_class, User)
|
|
218
246
|
user_table_class = user_model_registry.get_user_table_class()
|
|
247
|
+
assert issubclass(user_table_class, UserTable)
|
|
219
248
|
async with get_session() as db:
|
|
220
249
|
db_user = await db.get(user_table_class, id)
|
|
221
250
|
old_nft_count = 0 # Default for new users
|
|
@@ -256,7 +285,7 @@ class User(UserUpdate):
|
|
|
256
285
|
]
|
|
257
286
|
|
|
258
287
|
@classmethod
|
|
259
|
-
async def get(cls, user_id: str) ->
|
|
288
|
+
async def get(cls, user_id: str) -> UserModelType | None:
|
|
260
289
|
"""Get a user by ID.
|
|
261
290
|
|
|
262
291
|
Args:
|
|
@@ -271,7 +300,7 @@ class User(UserUpdate):
|
|
|
271
300
|
@classmethod
|
|
272
301
|
async def get_in_session(
|
|
273
302
|
cls, session: AsyncSession, user_id: str
|
|
274
|
-
) ->
|
|
303
|
+
) -> UserModelType | None:
|
|
275
304
|
"""Get a user by ID using the provided session.
|
|
276
305
|
|
|
277
306
|
Args:
|
|
@@ -281,11 +310,40 @@ class User(UserUpdate):
|
|
|
281
310
|
Returns:
|
|
282
311
|
User model or None if not found
|
|
283
312
|
"""
|
|
313
|
+
user_model_class = user_model_registry.get_user_model_class()
|
|
314
|
+
assert issubclass(user_model_class, User)
|
|
284
315
|
user_table_class = user_model_registry.get_user_table_class()
|
|
316
|
+
assert issubclass(user_table_class, UserTable)
|
|
285
317
|
result = await session.execute(
|
|
286
318
|
select(user_table_class).where(user_table_class.id == user_id)
|
|
287
319
|
)
|
|
288
320
|
user = result.scalars().first()
|
|
289
321
|
if user is None:
|
|
290
322
|
return None
|
|
291
|
-
return
|
|
323
|
+
return user_model_class.model_validate(user)
|
|
324
|
+
|
|
325
|
+
@classmethod
|
|
326
|
+
async def get_by_tg(cls, telegram_username: str) -> UserModelType | None:
|
|
327
|
+
"""Get a user by telegram username.
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
telegram_username: Telegram username of the user to get
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
User model or None if not found
|
|
334
|
+
"""
|
|
335
|
+
user_model_class = user_model_registry.get_user_model_class()
|
|
336
|
+
assert issubclass(user_model_class, User)
|
|
337
|
+
user_table_class = user_model_registry.get_user_table_class()
|
|
338
|
+
assert issubclass(user_table_class, UserTable)
|
|
339
|
+
|
|
340
|
+
async with get_session() as session:
|
|
341
|
+
result = await session.execute(
|
|
342
|
+
select(user_table_class).where(
|
|
343
|
+
user_table_class.telegram_username == telegram_username
|
|
344
|
+
)
|
|
345
|
+
)
|
|
346
|
+
user = result.scalars().first()
|
|
347
|
+
if user is None:
|
|
348
|
+
return None
|
|
349
|
+
return user_model_class.model_validate(user)
|
|
@@ -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.acolyt.ask import AcolytAskGpt
|
|
8
7
|
from intentkit.skills.acolyt.base import AcolytBaseTool
|
|
9
8
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
@@ -28,7 +27,6 @@ class Config(SkillConfig):
|
|
|
28
27
|
async def get_skills(
|
|
29
28
|
config: "Config",
|
|
30
29
|
is_private: bool,
|
|
31
|
-
store: SkillStoreABC,
|
|
32
30
|
**_,
|
|
33
31
|
) -> list[AcolytBaseTool]:
|
|
34
32
|
"""Get all Acolyt skills.
|
|
@@ -36,7 +34,6 @@ async def get_skills(
|
|
|
36
34
|
Args:
|
|
37
35
|
config: The configuration for Acolyt skills.
|
|
38
36
|
is_private: Whether to include private skills.
|
|
39
|
-
store: The skill store for persisting data.
|
|
40
37
|
|
|
41
38
|
Returns:
|
|
42
39
|
A list of Acolyt skills.
|
|
@@ -53,7 +50,7 @@ async def get_skills(
|
|
|
53
50
|
# Get each skill using the cached getter
|
|
54
51
|
result = []
|
|
55
52
|
for name in available_skills:
|
|
56
|
-
skill = get_acolyt_skill(name
|
|
53
|
+
skill = get_acolyt_skill(name)
|
|
57
54
|
if skill:
|
|
58
55
|
result.append(skill)
|
|
59
56
|
return result
|
|
@@ -61,22 +58,18 @@ async def get_skills(
|
|
|
61
58
|
|
|
62
59
|
def get_acolyt_skill(
|
|
63
60
|
name: str,
|
|
64
|
-
store: SkillStoreABC,
|
|
65
61
|
) -> AcolytBaseTool | None:
|
|
66
62
|
"""Get an Acolyt skill by name.
|
|
67
63
|
|
|
68
64
|
Args:
|
|
69
65
|
name: The name of the skill to get
|
|
70
|
-
store: The skill store for persisting data
|
|
71
66
|
|
|
72
67
|
Returns:
|
|
73
68
|
The requested Acolyt skill
|
|
74
69
|
"""
|
|
75
70
|
if name == "ask_gpt":
|
|
76
71
|
if name not in _cache:
|
|
77
|
-
_cache[name] = AcolytAskGpt(
|
|
78
|
-
skill_store=store,
|
|
79
|
-
)
|
|
72
|
+
_cache[name] = AcolytAskGpt()
|
|
80
73
|
return _cache[name]
|
|
81
74
|
else:
|
|
82
75
|
logger.warning(f"Unknown Acolyt skill: {name}")
|
intentkit/skills/acolyt/ask.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import Literal
|
|
3
3
|
|
|
4
4
|
import httpx
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
@@ -48,7 +48,6 @@ class AcolytAskGpt(AcolytBaseTool):
|
|
|
48
48
|
- 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.
|
|
49
49
|
- 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
|
|
50
50
|
|
|
51
|
-
|
|
52
51
|
Attributes:
|
|
53
52
|
name (str): Name of the tool, specifically "acolyt_ask_gpt".
|
|
54
53
|
description (str): Comprehensive description of the tool's purpose and functionality.
|
|
@@ -64,9 +63,9 @@ class AcolytAskGpt(AcolytBaseTool):
|
|
|
64
63
|
DEX & Trading: 24h volume, top DEX liquidity, buy/sell ratio, price change comparison, high liquidity pairs.
|
|
65
64
|
Overall: Smart engagement/market cap ratio, mindshare/market cap ratio, smart follower percentage comparison across top AI agents.
|
|
66
65
|
"""
|
|
67
|
-
args_schema:
|
|
66
|
+
args_schema: type[BaseModel] = AcolytAskGptInput
|
|
68
67
|
|
|
69
|
-
async def _arun(self, question: str, **kwargs) ->
|
|
68
|
+
async def _arun(self, question: str, **kwargs) -> dict:
|
|
70
69
|
"""Run the tool to get answer from Acolyt GPT.
|
|
71
70
|
|
|
72
71
|
Args:
|
intentkit/skills/acolyt/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://acolyt-oracle-poc.vercel.app"
|
|
@@ -14,17 +12,14 @@ class AcolytBaseTool(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
|
-
return
|
|
22
|
+
return config.acolyt_api_key
|
|
28
23
|
# for backward compatibility, may only have api_key in skill_config
|
|
29
24
|
elif skill_config.get("api_key"):
|
|
30
25
|
return skill_config.get("api_key")
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
"description": "Integration with Acolyt Oracle providing blockchain oracle services for accessing and verifying off-chain data with secure API connections",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/acolyt/acolyt.jpg",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"Crypto",
|
|
10
|
+
"DeFi"
|
|
10
11
|
],
|
|
11
12
|
"properties": {
|
|
12
13
|
"enabled": {
|
|
@@ -86,4 +87,4 @@
|
|
|
86
87
|
}
|
|
87
88
|
},
|
|
88
89
|
"additionalProperties": true
|
|
89
|
-
}
|
|
90
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from typing import TypedDict
|
|
2
2
|
|
|
3
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
4
3
|
from intentkit.skills.aixbt.base import AIXBTBaseTool
|
|
5
4
|
from intentkit.skills.aixbt.projects import AIXBTProjects
|
|
6
5
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
@@ -27,7 +26,6 @@ class Config(SkillConfig):
|
|
|
27
26
|
async def get_skills(
|
|
28
27
|
config: "Config",
|
|
29
28
|
is_private: bool,
|
|
30
|
-
store: SkillStoreABC,
|
|
31
29
|
**_,
|
|
32
30
|
) -> list[AIXBTBaseTool]:
|
|
33
31
|
"""Get all AIXBT API skills."""
|
|
@@ -44,26 +42,17 @@ async def get_skills(
|
|
|
44
42
|
available_skills.append(skill_name)
|
|
45
43
|
|
|
46
44
|
# Get each skill using the cached getter
|
|
47
|
-
return [
|
|
48
|
-
get_aixbt_skill(
|
|
49
|
-
name=name,
|
|
50
|
-
store=store,
|
|
51
|
-
)
|
|
52
|
-
for name in available_skills
|
|
53
|
-
]
|
|
45
|
+
return [get_aixbt_skill(name) for name in available_skills]
|
|
54
46
|
|
|
55
47
|
|
|
56
48
|
def get_aixbt_skill(
|
|
57
49
|
name: str,
|
|
58
|
-
store: SkillStoreABC,
|
|
59
50
|
) -> AIXBTBaseTool:
|
|
60
51
|
"""Get an AIXBT API skill by name."""
|
|
61
52
|
|
|
62
53
|
if name == "aixbt_projects":
|
|
63
54
|
if name not in _cache:
|
|
64
|
-
_cache[name] = AIXBTProjects(
|
|
65
|
-
skill_store=store,
|
|
66
|
-
)
|
|
55
|
+
_cache[name] = AIXBTProjects()
|
|
67
56
|
return _cache[name]
|
|
68
57
|
else:
|
|
69
58
|
raise ValueError(f"Unknown AIXBT skill: {name}")
|
intentkit/skills/aixbt/base.py
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
from pydantic import BaseModel, Field
|
|
4
2
|
|
|
5
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
6
3
|
from intentkit.skills.base import IntentKitSkill
|
|
7
4
|
|
|
8
5
|
|
|
@@ -11,10 +8,7 @@ class AIXBTBaseTool(IntentKitSkill):
|
|
|
11
8
|
|
|
12
9
|
name: str = Field(description="The name of the tool")
|
|
13
10
|
description: str = Field(description="A description of what the tool does")
|
|
14
|
-
args_schema:
|
|
15
|
-
skill_store: SkillStoreABC = Field(
|
|
16
|
-
description="The skill store for persisting data"
|
|
17
|
-
)
|
|
11
|
+
args_schema: type[BaseModel]
|
|
18
12
|
|
|
19
13
|
@property
|
|
20
14
|
def category(self) -> str:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
4
|
import httpx
|
|
5
5
|
from langchain_core.tools import ToolException
|
|
@@ -17,23 +17,23 @@ class ProjectsInput(BaseModel):
|
|
|
17
17
|
default=10,
|
|
18
18
|
description="Number of projects to return (max 50)",
|
|
19
19
|
)
|
|
20
|
-
name:
|
|
20
|
+
name: str | None = Field(
|
|
21
21
|
default=None,
|
|
22
22
|
description="Filter projects by name (case-insensitive regex match)",
|
|
23
23
|
)
|
|
24
|
-
ticker:
|
|
24
|
+
ticker: str | None = Field(
|
|
25
25
|
default=None,
|
|
26
26
|
description="Filter projects by ticker symbol (case-insensitive match)",
|
|
27
27
|
)
|
|
28
|
-
xHandle:
|
|
28
|
+
xHandle: str | None = Field(
|
|
29
29
|
default=None,
|
|
30
30
|
description="Filter projects by X/Twitter handle",
|
|
31
31
|
)
|
|
32
|
-
minScore:
|
|
32
|
+
minScore: float | None = Field(
|
|
33
33
|
default=None,
|
|
34
34
|
description="Minimum score threshold",
|
|
35
35
|
)
|
|
36
|
-
chain:
|
|
36
|
+
chain: str | None = Field(
|
|
37
37
|
default=None,
|
|
38
38
|
description="Filter projects by blockchain",
|
|
39
39
|
)
|
|
@@ -53,18 +53,18 @@ class AIXBTProjects(AIXBTBaseTool):
|
|
|
53
53
|
"detailed information on recent developments. The 'alpha' keyword is a trigger "
|
|
54
54
|
"for accessing AIXBT's specific dataset for crypto research."
|
|
55
55
|
)
|
|
56
|
-
args_schema:
|
|
56
|
+
args_schema: type[BaseModel] = ProjectsInput
|
|
57
57
|
|
|
58
58
|
async def _arun(
|
|
59
59
|
self,
|
|
60
60
|
limit: int = 10,
|
|
61
|
-
name:
|
|
62
|
-
ticker:
|
|
63
|
-
xHandle:
|
|
64
|
-
minScore:
|
|
65
|
-
chain:
|
|
61
|
+
name: str | None = None,
|
|
62
|
+
ticker: str | None = None,
|
|
63
|
+
xHandle: str | None = None,
|
|
64
|
+
minScore: float | None = None,
|
|
65
|
+
chain: str | None = None,
|
|
66
66
|
**kwargs,
|
|
67
|
-
) ->
|
|
67
|
+
) -> dict[str, Any]:
|
|
68
68
|
"""
|
|
69
69
|
Search for cryptocurrency projects using AIXBT API.
|
|
70
70
|
|
|
@@ -89,9 +89,8 @@ class AIXBTProjects(AIXBTBaseTool):
|
|
|
89
89
|
"rate_limit_minutes"
|
|
90
90
|
):
|
|
91
91
|
await self.user_rate_limit_by_category(
|
|
92
|
-
context.user_id,
|
|
93
92
|
skill_config["rate_limit_number"],
|
|
94
|
-
skill_config["rate_limit_minutes"],
|
|
93
|
+
skill_config["rate_limit_minutes"] * 60,
|
|
95
94
|
)
|
|
96
95
|
|
|
97
96
|
# Get the API key from the agent's configuration
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"description": "Cryptocurrency project data and analytics through the AIXBT API",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/aixbt/aixbt.jpg",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"Crypto",
|
|
10
|
+
"Knowledge Base"
|
|
11
11
|
],
|
|
12
12
|
"properties": {
|
|
13
13
|
"enabled": {
|
|
@@ -96,4 +96,4 @@
|
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"additionalProperties": true
|
|
99
|
-
}
|
|
99
|
+
}
|
|
@@ -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.allora.base import AlloraBaseTool
|
|
8
7
|
from intentkit.skills.allora.price import AlloraGetPrice
|
|
9
8
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
@@ -28,7 +27,6 @@ class Config(SkillConfig):
|
|
|
28
27
|
async def get_skills(
|
|
29
28
|
config: "Config",
|
|
30
29
|
is_private: bool,
|
|
31
|
-
store: SkillStoreABC,
|
|
32
30
|
**_,
|
|
33
31
|
) -> list[AlloraBaseTool]:
|
|
34
32
|
"""Get all Allora skills.
|
|
@@ -36,7 +34,6 @@ async def get_skills(
|
|
|
36
34
|
Args:
|
|
37
35
|
config: The configuration for Allora skills.
|
|
38
36
|
is_private: Whether to include private skills.
|
|
39
|
-
store: The skill store for persisting data.
|
|
40
37
|
|
|
41
38
|
Returns:
|
|
42
39
|
A list of Allora skills.
|
|
@@ -53,7 +50,7 @@ async def get_skills(
|
|
|
53
50
|
# Get each skill using the cached getter
|
|
54
51
|
result = []
|
|
55
52
|
for name in available_skills:
|
|
56
|
-
skill = get_allora_skill(name
|
|
53
|
+
skill = get_allora_skill(name)
|
|
57
54
|
if skill:
|
|
58
55
|
result.append(skill)
|
|
59
56
|
return result
|
|
@@ -61,22 +58,18 @@ async def get_skills(
|
|
|
61
58
|
|
|
62
59
|
def get_allora_skill(
|
|
63
60
|
name: str,
|
|
64
|
-
store: SkillStoreABC,
|
|
65
61
|
) -> AlloraBaseTool:
|
|
66
62
|
"""Get an Allora skill by name.
|
|
67
63
|
|
|
68
64
|
Args:
|
|
69
65
|
name: The name of the skill to get
|
|
70
|
-
store: The skill store for persisting data
|
|
71
66
|
|
|
72
67
|
Returns:
|
|
73
68
|
The requested Allora skill
|
|
74
69
|
"""
|
|
75
70
|
if name == "get_price_prediction":
|
|
76
71
|
if name not in _cache:
|
|
77
|
-
_cache[name] = AlloraGetPrice(
|
|
78
|
-
skill_store=store,
|
|
79
|
-
)
|
|
72
|
+
_cache[name] = AlloraGetPrice()
|
|
80
73
|
return _cache[name]
|
|
81
74
|
else:
|
|
82
75
|
logger.warning(f"Unknown Allora skill: {name}")
|
intentkit/skills/allora/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.upshot.xyz/v2/allora"
|
|
@@ -14,17 +12,14 @@ class AlloraBaseTool(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
|
-
return
|
|
22
|
+
return config.allora_api_key
|
|
28
23
|
# for backward compatibility, may only have api_key in skill_config
|
|
29
24
|
elif skill_config.get("api_key"):
|
|
30
25
|
return skill_config.get("api_key")
|
intentkit/skills/allora/price.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from typing import Literal
|
|
1
|
+
from typing import Literal
|
|
2
2
|
|
|
3
3
|
import httpx
|
|
4
|
-
from
|
|
4
|
+
from langchain_core.tools.base import ToolException
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
7
7
|
from intentkit.skills.allora.base import AlloraBaseTool
|
|
@@ -57,7 +57,6 @@ class AlloraGetPrice(AlloraBaseTool):
|
|
|
57
57
|
The Allora Price Prediction Feed tool fetches the price prediction feed from the Allora API.
|
|
58
58
|
Ethereum (ETH) or Bitcoin (BTC) price predictions (5-minute, 8-hour)
|
|
59
59
|
|
|
60
|
-
|
|
61
60
|
Attributes:
|
|
62
61
|
name (str): Name of the tool, specifically "get_price_prediction".
|
|
63
62
|
description (str): Comprehensive description of the tool's purpose and functionality.
|
|
@@ -69,7 +68,7 @@ class AlloraGetPrice(AlloraBaseTool):
|
|
|
69
68
|
The Allora Price Prediction Feed tool fetches the price prediction feed from the Allora API.
|
|
70
69
|
Ethereum (ETH) or Bitcoin (BTC) price predictions (5-minute, 8-hour)
|
|
71
70
|
"""
|
|
72
|
-
args_schema:
|
|
71
|
+
args_schema: type[BaseModel] = AlloraGetPriceInput
|
|
73
72
|
|
|
74
73
|
def _run(self, question: str) -> AlloraGetPriceOutput:
|
|
75
74
|
"""Run the tool to get the token price prediction from Allora API.
|
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
"description": "Integration with Allora API for blockchain-based price predictions and market forecasting services via Upshot's prediction markets",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/allora/allora.jpeg",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"Crypto"
|
|
9
10
|
],
|
|
10
11
|
"properties": {
|
|
11
12
|
"enabled": {
|
|
12
13
|
"type": "boolean",
|
|
13
14
|
"title": "Enabled",
|
|
14
15
|
"description": "Whether this skill is enabled",
|
|
15
|
-
"default":
|
|
16
|
+
"default": false
|
|
16
17
|
},
|
|
17
18
|
"states": {
|
|
18
19
|
"type": "object",
|