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,92 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Any, Dict, Optional, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.slack.base import SlackBaseTool
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SlackScheduleMessageSchema(BaseModel):
|
|
11
|
+
"""Input schema for SlackScheduleMessage."""
|
|
12
|
+
|
|
13
|
+
channel_id: str = Field(
|
|
14
|
+
description="The ID of the channel to send the scheduled message to",
|
|
15
|
+
)
|
|
16
|
+
text: str = Field(
|
|
17
|
+
description="The text content of the message to schedule",
|
|
18
|
+
)
|
|
19
|
+
post_at: str = Field(
|
|
20
|
+
description="The time to send the message in ISO format (e.g., '2023-12-25T10:00:00Z')",
|
|
21
|
+
)
|
|
22
|
+
thread_ts: Optional[str] = Field(
|
|
23
|
+
None,
|
|
24
|
+
description="The timestamp of the thread to reply to, if sending a thread reply",
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SlackScheduleMessage(SlackBaseTool):
|
|
29
|
+
"""Tool for scheduling messages to be sent to a Slack channel or thread."""
|
|
30
|
+
|
|
31
|
+
name: str = "slack_schedule_message"
|
|
32
|
+
description: str = "Schedule a message to be sent to a Slack channel or thread at a specific time, if you need current time, use skill common_current_time"
|
|
33
|
+
args_schema: Type[BaseModel] = SlackScheduleMessageSchema
|
|
34
|
+
|
|
35
|
+
async def _arun(
|
|
36
|
+
self,
|
|
37
|
+
config: RunnableConfig,
|
|
38
|
+
channel_id: str,
|
|
39
|
+
text: str,
|
|
40
|
+
post_at: str,
|
|
41
|
+
thread_ts: Optional[str] = None,
|
|
42
|
+
**kwargs,
|
|
43
|
+
) -> Dict[str, Any]:
|
|
44
|
+
"""Run the tool to schedule a Slack message.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
channel_id: The ID of the channel to send the message to
|
|
48
|
+
text: The text content of the message to schedule
|
|
49
|
+
post_at: The time to send the message in ISO format
|
|
50
|
+
thread_ts: The timestamp of the thread to reply to, if sending a thread reply
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Information about the scheduled message
|
|
54
|
+
|
|
55
|
+
Raises:
|
|
56
|
+
Exception: If an error occurs scheduling the message
|
|
57
|
+
"""
|
|
58
|
+
context = self.context_from_config(config)
|
|
59
|
+
client = self.get_client(context.config.get("slack_bot_token"))
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
# Convert ISO datetime string to Unix timestamp
|
|
63
|
+
post_datetime = datetime.fromisoformat(post_at.replace("Z", "+00:00"))
|
|
64
|
+
post_time_unix = int(post_datetime.timestamp())
|
|
65
|
+
|
|
66
|
+
# Prepare message parameters
|
|
67
|
+
message_params = {
|
|
68
|
+
"channel": channel_id,
|
|
69
|
+
"text": text,
|
|
70
|
+
"post_at": post_time_unix,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Add thread_ts if replying to a thread
|
|
74
|
+
if thread_ts:
|
|
75
|
+
message_params["thread_ts"] = thread_ts
|
|
76
|
+
|
|
77
|
+
# Schedule the message
|
|
78
|
+
response = client.chat_scheduleMessage(**message_params)
|
|
79
|
+
|
|
80
|
+
if response["ok"]:
|
|
81
|
+
return {
|
|
82
|
+
"channel": channel_id,
|
|
83
|
+
"scheduled_message_id": response["scheduled_message_id"],
|
|
84
|
+
"post_at": post_at,
|
|
85
|
+
"text": text,
|
|
86
|
+
"thread_ts": thread_ts,
|
|
87
|
+
}
|
|
88
|
+
else:
|
|
89
|
+
raise Exception(f"Error scheduling message: {response.get('error')}")
|
|
90
|
+
|
|
91
|
+
except Exception as e:
|
|
92
|
+
raise Exception(f"Error scheduling message: {str(e)}")
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Slack",
|
|
5
|
+
"description": "Integration with Slack API enabling workspace communication including channel management, message retrieval, and posting capabilities for team collaboration",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/slack/slack.jpg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Social"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"enabled": {
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"title": "Enabled",
|
|
14
|
+
"description": "Whether this skill is enabled",
|
|
15
|
+
"default": false
|
|
16
|
+
},
|
|
17
|
+
"states": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"get_channel": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"title": "Get Channel",
|
|
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": "State of the get_channel skill",
|
|
34
|
+
"default": "disabled"
|
|
35
|
+
},
|
|
36
|
+
"get_message": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"title": "Get Message",
|
|
39
|
+
"enum": [
|
|
40
|
+
"disabled",
|
|
41
|
+
"public",
|
|
42
|
+
"private"
|
|
43
|
+
],
|
|
44
|
+
"x-enum-title": [
|
|
45
|
+
"Disabled",
|
|
46
|
+
"Agent Owner + All Users",
|
|
47
|
+
"Agent Owner Only"
|
|
48
|
+
],
|
|
49
|
+
"description": "State of the get_message skill",
|
|
50
|
+
"default": "disabled"
|
|
51
|
+
},
|
|
52
|
+
"schedule_message": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"title": "Schedule Message",
|
|
55
|
+
"enum": [
|
|
56
|
+
"disabled",
|
|
57
|
+
"public",
|
|
58
|
+
"private"
|
|
59
|
+
],
|
|
60
|
+
"x-enum-title": [
|
|
61
|
+
"Disabled",
|
|
62
|
+
"Agent Owner + All Users",
|
|
63
|
+
"Agent Owner Only"
|
|
64
|
+
],
|
|
65
|
+
"description": "State of the schedule_message skill",
|
|
66
|
+
"default": "disabled"
|
|
67
|
+
},
|
|
68
|
+
"send_message": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"title": "Send Message",
|
|
71
|
+
"enum": [
|
|
72
|
+
"disabled",
|
|
73
|
+
"public",
|
|
74
|
+
"private"
|
|
75
|
+
],
|
|
76
|
+
"x-enum-title": [
|
|
77
|
+
"Disabled",
|
|
78
|
+
"Agent Owner + All Users",
|
|
79
|
+
"Agent Owner Only"
|
|
80
|
+
],
|
|
81
|
+
"description": "State of the send_message skill",
|
|
82
|
+
"default": "disabled"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"description": "States for each Slack skill (disabled, public, or private)"
|
|
86
|
+
},
|
|
87
|
+
"api_key_provider": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"title": "API Key Provider",
|
|
90
|
+
"description": "Provider of the API key for AIXBT API service",
|
|
91
|
+
"enum": [
|
|
92
|
+
"agent_owner"
|
|
93
|
+
],
|
|
94
|
+
"x-enum-title": [
|
|
95
|
+
"Owner Provided"
|
|
96
|
+
],
|
|
97
|
+
"default": "agent_owner"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"required": [
|
|
101
|
+
"states",
|
|
102
|
+
"enabled"
|
|
103
|
+
],
|
|
104
|
+
"if": {
|
|
105
|
+
"properties": {
|
|
106
|
+
"api_key_provider": {
|
|
107
|
+
"const": "agent_owner"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"then": {
|
|
112
|
+
"properties": {
|
|
113
|
+
"slack_bot_token": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"title": "Slack Bot Token",
|
|
116
|
+
"x-link": "[Get your API key](https://api.slack.com/)",
|
|
117
|
+
"x-sensitive": true,
|
|
118
|
+
"description": "Slack bot token for API access"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"if": {
|
|
122
|
+
"properties": {
|
|
123
|
+
"enabled": {
|
|
124
|
+
"const": true
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"then": {
|
|
129
|
+
"required": [
|
|
130
|
+
"slack_bot_token"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"additionalProperties": true
|
|
135
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from typing import Optional, Type
|
|
2
|
+
|
|
3
|
+
from langchain_core.runnables import RunnableConfig
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
|
|
6
|
+
from intentkit.skills.slack.base import SlackBaseTool, SlackMessage
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SlackSendMessageSchema(BaseModel):
|
|
10
|
+
"""Input schema for SlackSendMessage."""
|
|
11
|
+
|
|
12
|
+
channel_id: str = Field(
|
|
13
|
+
description="The ID of the channel to send the message to",
|
|
14
|
+
)
|
|
15
|
+
text: str = Field(
|
|
16
|
+
description="The text content of the message to send",
|
|
17
|
+
)
|
|
18
|
+
thread_ts: Optional[str] = Field(
|
|
19
|
+
None,
|
|
20
|
+
description="The timestamp of the thread to reply to, if sending a thread reply",
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class SlackSendMessage(SlackBaseTool):
|
|
25
|
+
"""Tool for sending messages to a Slack channel or thread."""
|
|
26
|
+
|
|
27
|
+
name: str = "slack_send_message"
|
|
28
|
+
description: str = "Send a message to a Slack channel or thread"
|
|
29
|
+
args_schema: Type[BaseModel] = SlackSendMessageSchema
|
|
30
|
+
|
|
31
|
+
async def _arun(
|
|
32
|
+
self,
|
|
33
|
+
config: RunnableConfig,
|
|
34
|
+
channel_id: str,
|
|
35
|
+
text: str,
|
|
36
|
+
thread_ts: Optional[str] = None,
|
|
37
|
+
**kwargs,
|
|
38
|
+
) -> SlackMessage:
|
|
39
|
+
"""Run the tool to send a Slack message.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
channel_id: The ID of the channel to send the message to
|
|
43
|
+
text: The text content of the message to send
|
|
44
|
+
thread_ts: The timestamp of the thread to reply to, if sending a thread reply
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Information about the sent message
|
|
48
|
+
|
|
49
|
+
Raises:
|
|
50
|
+
Exception: If an error occurs sending the message
|
|
51
|
+
"""
|
|
52
|
+
context = self.context_from_config(config)
|
|
53
|
+
client = self.get_client(context.config.get("slack_bot_token"))
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
# Prepare message parameters
|
|
57
|
+
message_params = {
|
|
58
|
+
"channel": channel_id,
|
|
59
|
+
"text": text,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# Add thread_ts if replying to a thread
|
|
63
|
+
if thread_ts:
|
|
64
|
+
message_params["thread_ts"] = thread_ts
|
|
65
|
+
|
|
66
|
+
# Send the message
|
|
67
|
+
response = client.chat_postMessage(**message_params)
|
|
68
|
+
|
|
69
|
+
if response["ok"]:
|
|
70
|
+
return SlackMessage(
|
|
71
|
+
ts=response["ts"],
|
|
72
|
+
text=text,
|
|
73
|
+
user=response["message"]["user"],
|
|
74
|
+
channel=channel_id,
|
|
75
|
+
thread_ts=thread_ts,
|
|
76
|
+
)
|
|
77
|
+
else:
|
|
78
|
+
raise Exception(f"Error sending message: {response.get('error')}")
|
|
79
|
+
|
|
80
|
+
except Exception as e:
|
|
81
|
+
raise Exception(f"Error sending message: {str(e)}")
|
|
Binary file
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""System skills."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TypedDict
|
|
5
|
+
|
|
6
|
+
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
|
+
from intentkit.skills.base import SkillConfig, SkillOwnerState
|
|
8
|
+
from intentkit.skills.system.base import SystemBaseTool
|
|
9
|
+
from intentkit.skills.system.read_agent_api_key import ReadAgentApiKey
|
|
10
|
+
from intentkit.skills.system.regenerate_agent_api_key import RegenerateAgentApiKey
|
|
11
|
+
|
|
12
|
+
# Cache skills at the system level, because they are stateless
|
|
13
|
+
_cache: dict[str, SystemBaseTool] = {}
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SkillStates(TypedDict):
|
|
19
|
+
read_agent_api_key: SkillOwnerState
|
|
20
|
+
regenerate_agent_api_key: SkillOwnerState
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Config(SkillConfig):
|
|
24
|
+
"""Configuration for system skills."""
|
|
25
|
+
|
|
26
|
+
states: SkillStates
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def get_skills(
|
|
30
|
+
config: "Config",
|
|
31
|
+
is_private: bool,
|
|
32
|
+
store: SkillStoreABC,
|
|
33
|
+
**_,
|
|
34
|
+
) -> list[SystemBaseTool]:
|
|
35
|
+
"""Get all system skills.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
config: The configuration for system skills.
|
|
39
|
+
is_private: Whether to include private skills.
|
|
40
|
+
store: The skill store for persisting data.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
A list of system skills.
|
|
44
|
+
"""
|
|
45
|
+
available_skills = []
|
|
46
|
+
|
|
47
|
+
# Include skills based on their state
|
|
48
|
+
for skill_name, state in config["states"].items():
|
|
49
|
+
if state == "disabled":
|
|
50
|
+
continue
|
|
51
|
+
elif state == "public" or (state == "private" and is_private):
|
|
52
|
+
available_skills.append(skill_name)
|
|
53
|
+
|
|
54
|
+
# Get each skill using the cached getter
|
|
55
|
+
result = []
|
|
56
|
+
for name in available_skills:
|
|
57
|
+
skill = get_system_skill(name, store)
|
|
58
|
+
if skill:
|
|
59
|
+
result.append(skill)
|
|
60
|
+
return result
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_system_skill(
|
|
64
|
+
name: str,
|
|
65
|
+
store: SkillStoreABC,
|
|
66
|
+
) -> SystemBaseTool:
|
|
67
|
+
"""Get a system skill by name.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
name: The name of the skill to get
|
|
71
|
+
store: The skill store for persisting data
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
The requested system skill
|
|
75
|
+
"""
|
|
76
|
+
if name == "read_agent_api_key":
|
|
77
|
+
if name not in _cache:
|
|
78
|
+
_cache[name] = ReadAgentApiKey(
|
|
79
|
+
skill_store=store,
|
|
80
|
+
)
|
|
81
|
+
return _cache[name]
|
|
82
|
+
elif name == "regenerate_agent_api_key":
|
|
83
|
+
if name not in _cache:
|
|
84
|
+
_cache[name] = RegenerateAgentApiKey(
|
|
85
|
+
skill_store=store,
|
|
86
|
+
)
|
|
87
|
+
return _cache[name]
|
|
88
|
+
else:
|
|
89
|
+
logger.warning(f"Unknown system skill: {name}")
|
|
90
|
+
return None
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import secrets
|
|
2
|
+
|
|
3
|
+
from intentkit.skills.base import IntentKitSkill
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SystemBaseTool(IntentKitSkill):
|
|
7
|
+
"""Base class for system-related skills."""
|
|
8
|
+
|
|
9
|
+
@property
|
|
10
|
+
def category(self) -> str:
|
|
11
|
+
"""Return the skill category."""
|
|
12
|
+
return "system"
|
|
13
|
+
|
|
14
|
+
def _generate_api_key(self) -> str:
|
|
15
|
+
"""Generate a new API key using secure random bytes."""
|
|
16
|
+
# Generate 32 random bytes and convert to hex string
|
|
17
|
+
return f"sk-{secrets.token_hex(32)}"
|
|
18
|
+
|
|
19
|
+
def _generate_public_api_key(self) -> str:
|
|
20
|
+
"""Generate a new public API key using secure random bytes."""
|
|
21
|
+
# Generate 32 random bytes and convert to hex string
|
|
22
|
+
return f"pk-{secrets.token_hex(32)}"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from langchain_core.runnables import RunnableConfig
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
from intentkit.skills.system.base import SystemBaseTool
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ReadAgentApiKeyInput(BaseModel):
|
|
8
|
+
"""Input model for read_agent_api_key skill."""
|
|
9
|
+
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ReadAgentApiKeyOutput(BaseModel):
|
|
14
|
+
"""Output model for read_agent_api_key skill."""
|
|
15
|
+
|
|
16
|
+
api_key: str = Field(description="The private API key for the agent (sk-)")
|
|
17
|
+
api_key_public: str = Field(description="The public API key for the agent (pk-)")
|
|
18
|
+
is_new: bool = Field(description="Whether new API keys were generated")
|
|
19
|
+
open_api_base_url: str = Field(description="The base URL for the API")
|
|
20
|
+
api_endpoint: str = Field(description="The full API endpoint URL")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ReadAgentApiKey(SystemBaseTool):
|
|
24
|
+
"""Skill to retrieve or generate an API key for the agent."""
|
|
25
|
+
|
|
26
|
+
name: str = "system_read_agent_api_key"
|
|
27
|
+
description: str = (
|
|
28
|
+
"Retrieve the API keys for the agent. "
|
|
29
|
+
"Returns both private (sk-) and public (pk-) API keys. "
|
|
30
|
+
"Private API key can access all skills (public and owner-only). "
|
|
31
|
+
"Public API key can only access public skills. "
|
|
32
|
+
"Make sure to tell the user the base URL and endpoint. "
|
|
33
|
+
"Tell user in OpenAI sdk or Desktop client like Cherry Studio, input the base URL and API key. "
|
|
34
|
+
"Always use markdown code block to wrap the API keys, base URL, and endpoint. "
|
|
35
|
+
"Tell user to check more doc in https://github.com/crestalnetwork/intentkit/blob/main/docs/skills/agent_api_key.md "
|
|
36
|
+
)
|
|
37
|
+
args_schema = ReadAgentApiKeyInput
|
|
38
|
+
|
|
39
|
+
async def _arun(self, config: RunnableConfig, **kwargs) -> ReadAgentApiKeyOutput:
|
|
40
|
+
"""Retrieve or generate an API key for the agent."""
|
|
41
|
+
# Get context from runnable config to access agent.id
|
|
42
|
+
context = self.context_from_config(config)
|
|
43
|
+
agent_id = context.agent.id
|
|
44
|
+
|
|
45
|
+
# Get agent data from skill store
|
|
46
|
+
agent_data = await self.skill_store.get_agent_data(agent_id)
|
|
47
|
+
|
|
48
|
+
if not agent_data:
|
|
49
|
+
raise ValueError(f"Agent data not found for agent_id: {agent_id}")
|
|
50
|
+
|
|
51
|
+
# Get API base URL from system config
|
|
52
|
+
open_api_base_url = self.skill_store.get_system_config("open_api_base_url")
|
|
53
|
+
api_endpoint = f"{open_api_base_url}/v1/chat/completions"
|
|
54
|
+
|
|
55
|
+
# Check if API keys exist
|
|
56
|
+
if agent_data.api_key and agent_data.api_key_public:
|
|
57
|
+
return ReadAgentApiKeyOutput(
|
|
58
|
+
api_key=agent_data.api_key,
|
|
59
|
+
api_key_public=agent_data.api_key_public,
|
|
60
|
+
is_new=False,
|
|
61
|
+
open_api_base_url=open_api_base_url,
|
|
62
|
+
api_endpoint=api_endpoint,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Generate new API keys if any are missing
|
|
66
|
+
new_api_key = agent_data.api_key or self._generate_api_key()
|
|
67
|
+
new_public_api_key = (
|
|
68
|
+
agent_data.api_key_public or self._generate_public_api_key()
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Save the API keys to agent data
|
|
72
|
+
update_data = {}
|
|
73
|
+
if not agent_data.api_key:
|
|
74
|
+
update_data["api_key"] = new_api_key
|
|
75
|
+
if not agent_data.api_key_public:
|
|
76
|
+
update_data["api_key_public"] = new_public_api_key
|
|
77
|
+
|
|
78
|
+
if update_data:
|
|
79
|
+
await self.skill_store.set_agent_data(agent_id, update_data)
|
|
80
|
+
|
|
81
|
+
return ReadAgentApiKeyOutput(
|
|
82
|
+
api_key=new_api_key,
|
|
83
|
+
api_key_public=new_public_api_key,
|
|
84
|
+
is_new=bool(update_data),
|
|
85
|
+
open_api_base_url=open_api_base_url,
|
|
86
|
+
api_endpoint=api_endpoint,
|
|
87
|
+
)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
from langchain_core.runnables import RunnableConfig
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
from intentkit.skills.system.base import SystemBaseTool
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class RegenerateAgentApiKeyInput(BaseModel):
|
|
8
|
+
"""Input model for regenerate_agent_api_key skill."""
|
|
9
|
+
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RegenerateAgentApiKeyOutput(BaseModel):
|
|
14
|
+
"""Output model for regenerate_agent_api_key skill."""
|
|
15
|
+
|
|
16
|
+
api_key: str = Field(description="The new private API key for the agent (sk-)")
|
|
17
|
+
api_key_public: str = Field(
|
|
18
|
+
description="The new public API key for the agent (pk-)"
|
|
19
|
+
)
|
|
20
|
+
previous_key_existed: bool = Field(description="Whether previous API keys existed")
|
|
21
|
+
open_api_base_url: str = Field(description="The base URL for the API")
|
|
22
|
+
api_endpoint: str = Field(description="The full API endpoint URL")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class RegenerateAgentApiKey(SystemBaseTool):
|
|
26
|
+
"""Skill to regenerate and reset the API key for the agent."""
|
|
27
|
+
|
|
28
|
+
name: str = "system_regenerate_agent_api_key"
|
|
29
|
+
description: str = (
|
|
30
|
+
"Generate new API keys for the agent, revoke any existing keys. "
|
|
31
|
+
"Generates both private (sk-) and public (pk-) API keys. "
|
|
32
|
+
"Private API key can access all skills (public and owner-only). "
|
|
33
|
+
"Public API key can only access public skills. "
|
|
34
|
+
"Make sure to tell the user the base URL and endpoint. "
|
|
35
|
+
"Tell user in OpenAI sdk or Desktop client like Cherry Studio, input the base URL and API key. "
|
|
36
|
+
"Always use markdown code block to wrap the API keys, base URL, and endpoint. "
|
|
37
|
+
"Tell user to check more doc in https://github.com/crestalnetwork/intentkit/blob/main/docs/skills/agent_api_key.md "
|
|
38
|
+
)
|
|
39
|
+
args_schema = RegenerateAgentApiKeyInput
|
|
40
|
+
|
|
41
|
+
async def _arun(
|
|
42
|
+
self, config: RunnableConfig, **kwargs
|
|
43
|
+
) -> RegenerateAgentApiKeyOutput:
|
|
44
|
+
"""Generate and set a new API key for the agent."""
|
|
45
|
+
# Get context from runnable config to access agent.id
|
|
46
|
+
context = self.context_from_config(config)
|
|
47
|
+
agent_id = context.agent.id
|
|
48
|
+
|
|
49
|
+
# Get agent data from skill store
|
|
50
|
+
agent_data = await self.skill_store.get_agent_data(agent_id)
|
|
51
|
+
|
|
52
|
+
if not agent_data:
|
|
53
|
+
raise ValueError(f"Agent data not found for agent_id: {agent_id}")
|
|
54
|
+
|
|
55
|
+
# Get API base URL from system config
|
|
56
|
+
open_api_base_url = self.skill_store.get_system_config("open_api_base_url")
|
|
57
|
+
api_endpoint = f"{open_api_base_url}/v1/chat/completions"
|
|
58
|
+
|
|
59
|
+
# Check if previous API keys existed
|
|
60
|
+
previous_key_existed = bool(agent_data.api_key or agent_data.api_key_public)
|
|
61
|
+
|
|
62
|
+
# Generate new API keys
|
|
63
|
+
new_api_key = self._generate_api_key()
|
|
64
|
+
new_public_api_key = self._generate_public_api_key()
|
|
65
|
+
|
|
66
|
+
# Save the new API keys to agent data (overwrites existing)
|
|
67
|
+
await self.skill_store.set_agent_data(
|
|
68
|
+
agent_id, {"api_key": new_api_key, "api_key_public": new_public_api_key}
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
return RegenerateAgentApiKeyOutput(
|
|
72
|
+
api_key=new_api_key,
|
|
73
|
+
api_key_public=new_public_api_key,
|
|
74
|
+
previous_key_existed=previous_key_existed,
|
|
75
|
+
open_api_base_url=open_api_base_url,
|
|
76
|
+
api_endpoint=api_endpoint,
|
|
77
|
+
)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "System",
|
|
5
|
+
"description": "System management and configuration skills for agent operations including API key management",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/system/system.svg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"System",
|
|
9
|
+
"Management",
|
|
10
|
+
"Configuration"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"enabled": {
|
|
14
|
+
"type": "boolean",
|
|
15
|
+
"title": "Enabled",
|
|
16
|
+
"description": "Whether this skill is enabled",
|
|
17
|
+
"default": true
|
|
18
|
+
},
|
|
19
|
+
"states": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"properties": {
|
|
22
|
+
"read_agent_api_key": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"title": "Read Agent API Key",
|
|
25
|
+
"enum": [
|
|
26
|
+
"disabled",
|
|
27
|
+
"private"
|
|
28
|
+
],
|
|
29
|
+
"x-enum-title": [
|
|
30
|
+
"Disabled",
|
|
31
|
+
"Agent Owner Only"
|
|
32
|
+
],
|
|
33
|
+
"description": "Retrieve the API key for the agent. If no API key exists, generates and sets a new one.",
|
|
34
|
+
"default": "private"
|
|
35
|
+
},
|
|
36
|
+
"regenerate_agent_api_key": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"title": "Regenerate Agent API Key",
|
|
39
|
+
"enum": [
|
|
40
|
+
"disabled",
|
|
41
|
+
"private"
|
|
42
|
+
],
|
|
43
|
+
"x-enum-title": [
|
|
44
|
+
"Disabled",
|
|
45
|
+
"Agent Owner Only"
|
|
46
|
+
],
|
|
47
|
+
"description": "Generate a new API key for the agent, replacing any existing key.",
|
|
48
|
+
"default": "private"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|