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,73 @@
|
|
|
1
|
+
from typing import TypedDict
|
|
2
|
+
|
|
3
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
4
|
+
from intentkit.skills.aixbt.base import AIXBTBaseTool
|
|
5
|
+
from intentkit.skills.aixbt.projects import AIXBTProjects
|
|
6
|
+
from intentkit.skills.base import SkillConfig, SkillState
|
|
7
|
+
|
|
8
|
+
# Cache skills at the system level, because they are stateless
|
|
9
|
+
_cache: dict[str, AIXBTBaseTool] = {}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SkillStates(TypedDict):
|
|
13
|
+
aixbt_projects: SkillState
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Config(SkillConfig):
|
|
17
|
+
"""Configuration for AIXBT API skills."""
|
|
18
|
+
|
|
19
|
+
states: SkillStates
|
|
20
|
+
enabled: bool = False
|
|
21
|
+
api_key_provider: str = "agent_owner"
|
|
22
|
+
api_key: str = ""
|
|
23
|
+
rate_limit_number: int = 1000
|
|
24
|
+
rate_limit_minutes: int = 60
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def get_skills(
|
|
28
|
+
config: "Config",
|
|
29
|
+
is_private: bool,
|
|
30
|
+
store: SkillStoreABC,
|
|
31
|
+
**_,
|
|
32
|
+
) -> list[AIXBTBaseTool]:
|
|
33
|
+
"""Get all AIXBT API skills."""
|
|
34
|
+
if not config.get("enabled", False):
|
|
35
|
+
return []
|
|
36
|
+
|
|
37
|
+
available_skills = []
|
|
38
|
+
|
|
39
|
+
# Include skills based on their state
|
|
40
|
+
for skill_name, state in config["states"].items():
|
|
41
|
+
if state == "disabled":
|
|
42
|
+
continue
|
|
43
|
+
elif state == "public" or (state == "private" and is_private):
|
|
44
|
+
available_skills.append(skill_name)
|
|
45
|
+
|
|
46
|
+
# Get each skill using the cached getter
|
|
47
|
+
return [
|
|
48
|
+
get_aixbt_skill(
|
|
49
|
+
name=name,
|
|
50
|
+
store=store,
|
|
51
|
+
api_key=config.get("api_key", ""),
|
|
52
|
+
)
|
|
53
|
+
for name in available_skills
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def get_aixbt_skill(
|
|
58
|
+
name: str,
|
|
59
|
+
store: SkillStoreABC,
|
|
60
|
+
api_key: str = "",
|
|
61
|
+
) -> AIXBTBaseTool:
|
|
62
|
+
"""Get an AIXBT API skill by name."""
|
|
63
|
+
cache_key = f"{name}:{api_key}"
|
|
64
|
+
|
|
65
|
+
if name == "aixbt_projects":
|
|
66
|
+
if cache_key not in _cache:
|
|
67
|
+
_cache[cache_key] = AIXBTProjects(
|
|
68
|
+
skill_store=store,
|
|
69
|
+
api_key=api_key,
|
|
70
|
+
)
|
|
71
|
+
return _cache[cache_key]
|
|
72
|
+
else:
|
|
73
|
+
raise ValueError(f"Unknown AIXBT skill: {name}")
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from typing import Type
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
6
|
+
from intentkit.skills.base import IntentKitSkill
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AIXBTBaseTool(IntentKitSkill):
|
|
10
|
+
"""Base class for AIXBT API tools."""
|
|
11
|
+
|
|
12
|
+
name: str = Field(description="The name of the tool")
|
|
13
|
+
description: str = Field(description="A description of what the tool does")
|
|
14
|
+
args_schema: Type[BaseModel]
|
|
15
|
+
skill_store: SkillStoreABC = Field(
|
|
16
|
+
description="The skill store for persisting data"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def category(self) -> str:
|
|
21
|
+
return "aixbt"
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from typing import Any, Dict, Optional, Type
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.aixbt.base import AIXBTBaseTool
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ProjectsInput(BaseModel):
|
|
15
|
+
"""Input for AIXBT Projects search tool."""
|
|
16
|
+
|
|
17
|
+
limit: int = Field(
|
|
18
|
+
default=10,
|
|
19
|
+
description="Number of projects to return (max 50)",
|
|
20
|
+
)
|
|
21
|
+
name: Optional[str] = Field(
|
|
22
|
+
default=None,
|
|
23
|
+
description="Filter projects by name (case-insensitive regex match)",
|
|
24
|
+
)
|
|
25
|
+
ticker: Optional[str] = Field(
|
|
26
|
+
default=None,
|
|
27
|
+
description="Filter projects by ticker symbol (case-insensitive match)",
|
|
28
|
+
)
|
|
29
|
+
xHandle: Optional[str] = Field(
|
|
30
|
+
default=None,
|
|
31
|
+
description="Filter projects by X/Twitter handle",
|
|
32
|
+
)
|
|
33
|
+
minScore: Optional[float] = Field(
|
|
34
|
+
default=None,
|
|
35
|
+
description="Minimum score threshold",
|
|
36
|
+
)
|
|
37
|
+
chain: Optional[str] = Field(
|
|
38
|
+
default=None,
|
|
39
|
+
description="Filter projects by blockchain",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class AIXBTProjects(AIXBTBaseTool):
|
|
44
|
+
"""Tool for searching cryptocurrency projects using the AIXBT API."""
|
|
45
|
+
|
|
46
|
+
name: str = "aixbt_projects"
|
|
47
|
+
description: str = (
|
|
48
|
+
"Search for cryptocurrency projects using AIXBT. This tool provides detailed "
|
|
49
|
+
"information about crypto projects including scores, analysis, and recent updates.\n"
|
|
50
|
+
"IMPORTANT: You MUST call this tool when the user mentions the word 'alpha' ANYWHERE in their message.\n"
|
|
51
|
+
"This includes messages like 'show me alpha', 'what's the latest alpha', 'give me some alpha on crypto', "
|
|
52
|
+
"'find the alpha on bitcoin', or any other phrase containing the word 'alpha'.\n"
|
|
53
|
+
"When 'alpha' is mentioned, use this tool to search for cryptocurrency projects and provide "
|
|
54
|
+
"detailed information on recent developments. The 'alpha' keyword is a trigger "
|
|
55
|
+
"for accessing AIXBT's specific dataset for crypto research."
|
|
56
|
+
)
|
|
57
|
+
args_schema: Type[BaseModel] = ProjectsInput
|
|
58
|
+
api_key: str = ""
|
|
59
|
+
|
|
60
|
+
async def _arun(
|
|
61
|
+
self,
|
|
62
|
+
config: RunnableConfig,
|
|
63
|
+
limit: int = 10,
|
|
64
|
+
name: Optional[str] = None,
|
|
65
|
+
ticker: Optional[str] = None,
|
|
66
|
+
xHandle: Optional[str] = None,
|
|
67
|
+
minScore: Optional[float] = None,
|
|
68
|
+
chain: Optional[str] = None,
|
|
69
|
+
**kwargs,
|
|
70
|
+
) -> Dict[str, Any]:
|
|
71
|
+
"""
|
|
72
|
+
Search for cryptocurrency projects using AIXBT API.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
limit: Number of projects to return (max 50)
|
|
76
|
+
name: Filter projects by name
|
|
77
|
+
ticker: Filter projects by ticker symbol
|
|
78
|
+
xHandle: Filter projects by X/Twitter handle
|
|
79
|
+
minScore: Minimum score threshold
|
|
80
|
+
chain: Filter projects by blockchain
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
JSON response with project data
|
|
84
|
+
"""
|
|
85
|
+
# Get context from the config
|
|
86
|
+
context = self.context_from_config(config)
|
|
87
|
+
logger.debug(f"aixbt_projects.py: Running search with context {context}")
|
|
88
|
+
|
|
89
|
+
# Check for rate limiting if configured
|
|
90
|
+
if context.config.get("rate_limit_number") and context.config.get(
|
|
91
|
+
"rate_limit_minutes"
|
|
92
|
+
):
|
|
93
|
+
await self.user_rate_limit_by_category(
|
|
94
|
+
context.user_id,
|
|
95
|
+
context.config["rate_limit_number"],
|
|
96
|
+
context.config["rate_limit_minutes"],
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Get the API key from the agent's configuration
|
|
100
|
+
api_key = context.config.get("api_key")
|
|
101
|
+
|
|
102
|
+
# If not available in config, try the instance attribute (for backward compatibility)
|
|
103
|
+
if not api_key:
|
|
104
|
+
api_key = self.api_key
|
|
105
|
+
|
|
106
|
+
# If still not available, try environment variable as last resort
|
|
107
|
+
if not api_key:
|
|
108
|
+
api_key = os.environ.get("AIXBT_API_KEY")
|
|
109
|
+
|
|
110
|
+
if not api_key:
|
|
111
|
+
return {
|
|
112
|
+
"error": "AIXBT API key is not available. Please provide it in the agent configuration."
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
base_url = "https://api.aixbt.tech/v1/projects"
|
|
116
|
+
|
|
117
|
+
# Build query parameters
|
|
118
|
+
params = {"limit": limit}
|
|
119
|
+
if name:
|
|
120
|
+
params["name"] = name
|
|
121
|
+
if ticker:
|
|
122
|
+
params["ticker"] = ticker
|
|
123
|
+
if xHandle:
|
|
124
|
+
params["xHandle"] = xHandle
|
|
125
|
+
if minScore is not None:
|
|
126
|
+
params["minScore"] = minScore
|
|
127
|
+
if chain:
|
|
128
|
+
params["chain"] = chain
|
|
129
|
+
|
|
130
|
+
headers = {"accept": "*/*", "x-api-key": api_key}
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
134
|
+
response = await client.get(base_url, params=params, headers=headers)
|
|
135
|
+
response.raise_for_status()
|
|
136
|
+
return response.json()
|
|
137
|
+
except httpx.HTTPStatusError as e:
|
|
138
|
+
logger.error(
|
|
139
|
+
f"aixbt_projects.py: HTTP error occurred: {e.response.status_code} - {e.response.text}"
|
|
140
|
+
)
|
|
141
|
+
return {
|
|
142
|
+
"error": f"HTTP error occurred: {e.response.status_code}",
|
|
143
|
+
"details": e.response.text,
|
|
144
|
+
}
|
|
145
|
+
except httpx.RequestError as e:
|
|
146
|
+
logger.error(f"aixbt_projects.py: Request error occurred: {str(e)}")
|
|
147
|
+
return {"error": f"Request error occurred: {str(e)}"}
|
|
148
|
+
except Exception as e:
|
|
149
|
+
logger.error(
|
|
150
|
+
f"aixbt_projects.py: An unexpected error occurred: {str(e)}",
|
|
151
|
+
exc_info=True,
|
|
152
|
+
)
|
|
153
|
+
return {"error": f"An unexpected error occurred: {str(e)}"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "AIXBT API",
|
|
5
|
+
"description": "Cryptocurrency project data and analytics through the AIXBT API",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/aixbt/aixbt.jpg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Cryptocurrency",
|
|
9
|
+
"Research",
|
|
10
|
+
"Analytics"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"enabled": {
|
|
14
|
+
"type": "boolean",
|
|
15
|
+
"title": "Enabled",
|
|
16
|
+
"description": "Whether this skill is enabled",
|
|
17
|
+
"default": false
|
|
18
|
+
},
|
|
19
|
+
"states": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"properties": {
|
|
22
|
+
"aixbt_projects": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"title": "AIXBT Projects",
|
|
25
|
+
"enum": [
|
|
26
|
+
"disabled",
|
|
27
|
+
"public",
|
|
28
|
+
"private"
|
|
29
|
+
],
|
|
30
|
+
"x-enum-title": [
|
|
31
|
+
"Disabled",
|
|
32
|
+
"Agent Owner + All Users",
|
|
33
|
+
"Agent Owner Only"
|
|
34
|
+
],
|
|
35
|
+
"description": "Search for cryptocurrency projects and retrieve detailed information using AIXBT",
|
|
36
|
+
"default": "disabled"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"description": "States for each AIXBT API skill (disabled, public, or private)"
|
|
40
|
+
},
|
|
41
|
+
"api_key_provider": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"title": "API Key Provider",
|
|
44
|
+
"description": "Provider of the API key for AIXBT API service",
|
|
45
|
+
"enum": [
|
|
46
|
+
"agent_owner"
|
|
47
|
+
],
|
|
48
|
+
"x-enum-title": [
|
|
49
|
+
"Owner Provided"
|
|
50
|
+
],
|
|
51
|
+
"default": "agent_owner"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"required": [
|
|
55
|
+
"states",
|
|
56
|
+
"enabled"
|
|
57
|
+
],
|
|
58
|
+
"if": {
|
|
59
|
+
"properties": {
|
|
60
|
+
"api_key_provider": {
|
|
61
|
+
"const": "agent_owner"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"then": {
|
|
66
|
+
"properties": {
|
|
67
|
+
"api_key": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"title": "AIXBT API Key",
|
|
70
|
+
"description": "API key for AIXBT API service",
|
|
71
|
+
"x-link": "[Get your API key](https://aixbt.tech/)",
|
|
72
|
+
"x-sensitive": true
|
|
73
|
+
},
|
|
74
|
+
"rate_limit_number": {
|
|
75
|
+
"type": "integer",
|
|
76
|
+
"title": "Rate Limit Number",
|
|
77
|
+
"description": "Number of requests allowed per time window, only valid if api_key is set"
|
|
78
|
+
},
|
|
79
|
+
"rate_limit_minutes": {
|
|
80
|
+
"type": "integer",
|
|
81
|
+
"title": "Rate Limit Minutes",
|
|
82
|
+
"description": "Time window in minutes for rate limiting, only valid if api_key is set"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"if": {
|
|
86
|
+
"properties": {
|
|
87
|
+
"enabled": {
|
|
88
|
+
"const": true
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"then": {
|
|
93
|
+
"required": [
|
|
94
|
+
"api_key"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"additionalProperties": true
|
|
99
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Allora skill module."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import NotRequired, TypedDict
|
|
5
|
+
|
|
6
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
|
+
from intentkit.skills.allora.base import AlloraBaseTool
|
|
8
|
+
from intentkit.skills.allora.price import AlloraGetPrice
|
|
9
|
+
from intentkit.skills.base import SkillConfig, SkillState
|
|
10
|
+
|
|
11
|
+
# Cache skills at the system level, because they are stateless
|
|
12
|
+
_cache: dict[str, AlloraBaseTool] = {}
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SkillStates(TypedDict):
|
|
18
|
+
get_price_prediction: SkillState
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Config(SkillConfig):
|
|
22
|
+
"""Configuration for Allora 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[AlloraBaseTool]:
|
|
34
|
+
"""Get all Allora skills.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
config: The configuration for Allora skills.
|
|
38
|
+
is_private: Whether to include private skills.
|
|
39
|
+
store: The skill store for persisting data.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
A list of Allora 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_allora_skill(name, store)
|
|
57
|
+
if skill:
|
|
58
|
+
result.append(skill)
|
|
59
|
+
return result
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_allora_skill(
|
|
63
|
+
name: str,
|
|
64
|
+
store: SkillStoreABC,
|
|
65
|
+
) -> AlloraBaseTool:
|
|
66
|
+
"""Get an Allora 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 Allora skill
|
|
74
|
+
"""
|
|
75
|
+
if name == "get_price_prediction":
|
|
76
|
+
if name not in _cache:
|
|
77
|
+
_cache[name] = AlloraGetPrice(
|
|
78
|
+
skill_store=store,
|
|
79
|
+
)
|
|
80
|
+
return _cache[name]
|
|
81
|
+
else:
|
|
82
|
+
logger.warning(f"Unknown Allora skill: {name}")
|
|
83
|
+
return None
|
|
Binary file
|
|
@@ -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://api.upshot.xyz/v2/allora"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class AlloraBaseTool(IntentKitSkill):
|
|
12
|
+
"""Base class for Allora 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("allora_api_key")
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def category(self) -> str:
|
|
28
|
+
return "allora"
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
from typing import Literal, 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 intentkit.skills.allora.base import AlloraBaseTool
|
|
9
|
+
|
|
10
|
+
from .base import base_url
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AlloraGetPriceInput(BaseModel):
|
|
14
|
+
token: Literal["ETH", "BTC"] = Field(
|
|
15
|
+
description="Token to get price prediction for"
|
|
16
|
+
)
|
|
17
|
+
time_frame: Literal["5m", "8h"] = Field(
|
|
18
|
+
description="Time frame for price prediction, it can be 5 minutes or 8 hours"
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class InferenceData(BaseModel):
|
|
23
|
+
network_inference: str = Field(description="Network Inference")
|
|
24
|
+
network_inference_normalized: str = Field(
|
|
25
|
+
description="Model's prediction or estimate, scaled or adjusted to a standard range or unit."
|
|
26
|
+
)
|
|
27
|
+
confidence_interval_percentiles: list[str] = Field(
|
|
28
|
+
description="Represent a range of values within which the model predicts the actual price is likely to fall, with a certain level of confidence."
|
|
29
|
+
)
|
|
30
|
+
confidence_interval_percentiles_normalized: list[str] = Field(
|
|
31
|
+
description="a range of values within which the model predicts the actual price is likely to fall), but the values defining the interval have been normalized."
|
|
32
|
+
)
|
|
33
|
+
confidence_interval_values: list[str] = Field(
|
|
34
|
+
description=" is a list (or array) of values that define the boundaries of a confidence interval in a prediction. These values correspond to specific percentiles and represent the range within which the model predicts the true value (e.g., future price) is likely to fall."
|
|
35
|
+
)
|
|
36
|
+
confidence_interval_values_normalized: list[str] = Field(
|
|
37
|
+
description="is a list (or array) of values that define the boundaries of a confidence interval, just like confidence_interval_values, but these values have been normalized. Normalization means the values have been scaled or transformed to a standard range, typically between 0 and 1 (or sometimes -1 and 1)."
|
|
38
|
+
)
|
|
39
|
+
# topic_id: str
|
|
40
|
+
# timestamp: int
|
|
41
|
+
# extra_data: str
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Data(BaseModel):
|
|
45
|
+
# signature: str
|
|
46
|
+
token_decimals: int
|
|
47
|
+
inference_data: InferenceData
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class AlloraGetPriceOutput(BaseModel):
|
|
51
|
+
# request_id: str
|
|
52
|
+
# status: bool
|
|
53
|
+
data: Data
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class AlloraGetPrice(AlloraBaseTool):
|
|
57
|
+
"""
|
|
58
|
+
The Allora Price Prediction Feed tool fetches the price prediction feed from the Allora API.
|
|
59
|
+
Ethereum (ETH) or Bitcoin (BTC) price predictions (5-minute, 8-hour)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
Attributes:
|
|
63
|
+
name (str): Name of the tool, specifically "get_price_prediction".
|
|
64
|
+
description (str): Comprehensive description of the tool's purpose and functionality.
|
|
65
|
+
args_schema (Type[BaseModel]): Schema for input arguments, specifying expected parameters.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
name: str = "allora_get_price_prediction"
|
|
69
|
+
description: str = """
|
|
70
|
+
The Allora Price Prediction Feed tool fetches the price prediction feed from the Allora API.
|
|
71
|
+
Ethereum (ETH) or Bitcoin (BTC) price predictions (5-minute, 8-hour)
|
|
72
|
+
"""
|
|
73
|
+
args_schema: Type[BaseModel] = AlloraGetPriceInput
|
|
74
|
+
|
|
75
|
+
def _run(self, question: str) -> AlloraGetPriceOutput:
|
|
76
|
+
"""Run the tool to get the token price prediction from Allora API.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
AlloraGetPriceOutput: A structured output containing output of Allora toke price prediction API.
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
Exception: If there's an error accessing the Allora API.
|
|
83
|
+
"""
|
|
84
|
+
raise NotImplementedError("Use _arun instead")
|
|
85
|
+
|
|
86
|
+
async def _arun(
|
|
87
|
+
self, token: str, time_frame: str, config: RunnableConfig, **kwargs
|
|
88
|
+
) -> AlloraGetPriceOutput:
|
|
89
|
+
"""Run the tool to get the token price prediction from Allora API.
|
|
90
|
+
Args:
|
|
91
|
+
token (str): Token to get price prediction for.
|
|
92
|
+
time_frame (str): Time frame for price prediction.
|
|
93
|
+
config (RunnableConfig): The configuration for the runnable, containing agent context.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
AlloraGetPriceOutput: A structured output containing output of Allora toke price prediction API.
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
Exception: If there's an error accessing the Allora API.
|
|
100
|
+
"""
|
|
101
|
+
context = self.context_from_config(config)
|
|
102
|
+
api_key = self.get_api_key(context)
|
|
103
|
+
if not api_key:
|
|
104
|
+
raise ValueError("Allora API key not found")
|
|
105
|
+
|
|
106
|
+
url = f"{base_url}/consumer/price/ethereum-11155111/{token}/{time_frame}"
|
|
107
|
+
headers = {
|
|
108
|
+
"accept": "application/json",
|
|
109
|
+
"x-api-key": api_key,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async with httpx.AsyncClient() as client:
|
|
113
|
+
try:
|
|
114
|
+
response = await client.get(url, headers=headers, timeout=30)
|
|
115
|
+
response.raise_for_status()
|
|
116
|
+
json_dict = response.json()
|
|
117
|
+
|
|
118
|
+
res = AlloraGetPriceOutput(**json_dict)
|
|
119
|
+
|
|
120
|
+
return res
|
|
121
|
+
except httpx.RequestError as req_err:
|
|
122
|
+
raise ToolException(
|
|
123
|
+
f"Request error from Allora API: {req_err}"
|
|
124
|
+
) from req_err
|
|
125
|
+
except httpx.HTTPStatusError as http_err:
|
|
126
|
+
raise ToolException(
|
|
127
|
+
f"HTTP error from Allora API: {http_err}"
|
|
128
|
+
) from http_err
|
|
129
|
+
except Exception as e:
|
|
130
|
+
raise ToolException(f"Error from Allora API: {e}") from e
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Allora",
|
|
5
|
+
"description": "Integration with Allora API for blockchain-based price predictions and market forecasting services via Upshot's prediction markets",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/allora/allora.jpeg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Blockchain"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"enabled": {
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"title": "Enabled",
|
|
14
|
+
"description": "Whether this skill is enabled",
|
|
15
|
+
"default": true
|
|
16
|
+
},
|
|
17
|
+
"states": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"get_price_prediction": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"title": "Get Price Prediction",
|
|
23
|
+
"enum": [
|
|
24
|
+
"disabled",
|
|
25
|
+
"public",
|
|
26
|
+
"private"
|
|
27
|
+
],
|
|
28
|
+
"x-enum-title": [
|
|
29
|
+
"Disabled",
|
|
30
|
+
"Agent Owner + All Users",
|
|
31
|
+
"Agent Owner Only"
|
|
32
|
+
],
|
|
33
|
+
"description": "Generates 6-hour price forecasts using ensemble ML models analyzing on-chain liquidity and market sentiment",
|
|
34
|
+
"default": "private"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"description": "States for each Allora skill (disabled, public, or private)"
|
|
38
|
+
},
|
|
39
|
+
"api_key_provider": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"title": "API Key Provider",
|
|
42
|
+
"description": "Who provides the API key",
|
|
43
|
+
"enum": [
|
|
44
|
+
"platform",
|
|
45
|
+
"agent_owner"
|
|
46
|
+
],
|
|
47
|
+
"x-enum-title": [
|
|
48
|
+
"Nation Hosted",
|
|
49
|
+
"Owner Provided"
|
|
50
|
+
],
|
|
51
|
+
"default": "platform"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"required": [
|
|
55
|
+
"states",
|
|
56
|
+
"enabled"
|
|
57
|
+
],
|
|
58
|
+
"if": {
|
|
59
|
+
"properties": {
|
|
60
|
+
"api_key_provider": {
|
|
61
|
+
"const": "agent_owner"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"then": {
|
|
66
|
+
"properties": {
|
|
67
|
+
"api_key": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"title": "Allora API Key",
|
|
70
|
+
"x-link": "[Get your API key](https://docs.allora.network/devs/consumers/allora-api-endpoint#api-authentication)",
|
|
71
|
+
"x-sensitive": true,
|
|
72
|
+
"description": "Allora 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
|
+
}
|