intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__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.
- intentkit/MANIFEST.in +14 -0
- intentkit/README.md +88 -0
- intentkit/__init__.py +6 -4
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +15 -8
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +9 -2
- intentkit/clients/cdp.py +129 -153
- intentkit/{utils → clients}/s3.py +109 -34
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +4 -7
- intentkit/config/config.py +123 -90
- intentkit/core/account_checking.py +802 -0
- intentkit/core/agent.py +313 -498
- intentkit/core/asset.py +267 -0
- intentkit/core/chat.py +5 -3
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +49 -41
- intentkit/core/draft.py +201 -0
- intentkit/core/draft_chat.py +118 -0
- intentkit/core/engine.py +378 -287
- intentkit/core/manager/__init__.py +25 -0
- intentkit/core/manager/engine.py +220 -0
- intentkit/core/manager/service.py +172 -0
- intentkit/core/manager/skills.py +178 -0
- intentkit/core/middleware.py +231 -0
- intentkit/core/prompt.py +74 -114
- intentkit/core/scheduler.py +143 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +931 -518
- intentkit/models/agent_data.py +165 -106
- intentkit/models/agent_schema.json +38 -251
- intentkit/models/app_setting.py +15 -13
- intentkit/models/chat.py +86 -140
- intentkit/models/credit.py +182 -162
- intentkit/models/db.py +42 -23
- intentkit/models/db_mig.py +120 -3
- intentkit/models/draft.py +222 -0
- intentkit/models/llm.csv +31 -0
- intentkit/models/llm.py +262 -370
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +222 -101
- intentkit/models/skills.csv +173 -0
- intentkit/models/team.py +189 -0
- intentkit/models/user.py +103 -31
- 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 +241 -41
- 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 +6 -6
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/casino/schema.json +0 -1
- 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 +10 -24
- 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 +8 -19
- 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/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -93
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- 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 +54 -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/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- 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 +2 -6
- intentkit/skills/firecrawl/scrape.py +17 -22
- 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 +13 -15
- intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
- intentkit/skills/heurist/image_generation_braindance.py +13 -15
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
- intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
- intentkit/skills/heurist/image_generation_sdxl.py +13 -15
- 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 +3 -9
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +150 -60
- 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 +30 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +4 -9
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +5 -9
- intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
- intentkit/skills/openai/gpt_image_to_image.py +5 -9
- 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 +36 -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 +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- 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 +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +4 -12
- 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 +11 -10
- 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 +58 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +40 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +7 -6
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/__init__.py +4 -0
- intentkit/utils/chain.py +198 -96
- intentkit/utils/ens.py +135 -0
- intentkit/utils/error.py +5 -2
- intentkit/utils/logging.py +9 -11
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +8 -8
- intentkit/utils/tx.py +16 -8
- intentkit/uv.lock +3377 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
- intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
- intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
- intentkit/core/node.py +0 -215
- intentkit/models/conversation.py +0 -286
- 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.7.5.dev3.dist-info/RECORD +0 -424
- {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
|
@@ -10,14 +10,14 @@ import base64
|
|
|
10
10
|
import logging
|
|
11
11
|
import os
|
|
12
12
|
import tempfile
|
|
13
|
-
from typing import Dict, List, Optional, Tuple
|
|
14
13
|
|
|
15
14
|
from langchain_community.vectorstores import FAISS
|
|
16
15
|
from langchain_core.documents import Document
|
|
17
16
|
from langchain_openai import OpenAIEmbeddings
|
|
18
17
|
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
|
19
18
|
|
|
20
|
-
from intentkit.
|
|
19
|
+
from intentkit.config.config import config
|
|
20
|
+
from intentkit.models.skill import AgentSkillData, AgentSkillDataCreate
|
|
21
21
|
|
|
22
22
|
logger = logging.getLogger(__name__)
|
|
23
23
|
|
|
@@ -62,21 +62,29 @@ METADATA_KEY_PREFIX = "indexed_urls"
|
|
|
62
62
|
class VectorStoreManager:
|
|
63
63
|
"""Manages vector store operations including creation, saving, loading, and merging."""
|
|
64
64
|
|
|
65
|
-
def __init__(self,
|
|
66
|
-
self.
|
|
65
|
+
def __init__(self, embedding_api_key: str | None = None):
|
|
66
|
+
self._embedding_api_key = embedding_api_key
|
|
67
|
+
|
|
68
|
+
def _resolve_api_key(self) -> str:
|
|
69
|
+
"""Resolve the OpenAI API key to use for embeddings."""
|
|
70
|
+
if self._embedding_api_key:
|
|
71
|
+
return self._embedding_api_key
|
|
72
|
+
if config.openai_api_key:
|
|
73
|
+
return config.openai_api_key
|
|
74
|
+
raise ValueError("OpenAI API key is not configured")
|
|
67
75
|
|
|
68
76
|
def create_embeddings(self) -> OpenAIEmbeddings:
|
|
69
|
-
"""Create OpenAI embeddings using
|
|
70
|
-
api_key = self.
|
|
77
|
+
"""Create OpenAI embeddings using the resolved API key."""
|
|
78
|
+
api_key = self._resolve_api_key()
|
|
71
79
|
return OpenAIEmbeddings(api_key=api_key)
|
|
72
80
|
|
|
73
|
-
def get_storage_keys(self, agent_id: str) ->
|
|
81
|
+
def get_storage_keys(self, agent_id: str) -> tuple[str, str]:
|
|
74
82
|
"""Get storage keys for vector store and metadata."""
|
|
75
83
|
vector_store_key = f"{VECTOR_STORE_KEY_PREFIX}_{agent_id}"
|
|
76
84
|
metadata_key = f"{METADATA_KEY_PREFIX}_{agent_id}"
|
|
77
85
|
return vector_store_key, metadata_key
|
|
78
86
|
|
|
79
|
-
def encode_vector_store(self, vector_store: FAISS) ->
|
|
87
|
+
def encode_vector_store(self, vector_store: FAISS) -> dict[str, str]:
|
|
80
88
|
"""Encode FAISS vector store to base64 for storage."""
|
|
81
89
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
82
90
|
vector_store.save_local(temp_dir)
|
|
@@ -93,7 +101,7 @@ class VectorStoreManager:
|
|
|
93
101
|
return encoded_files
|
|
94
102
|
|
|
95
103
|
def decode_vector_store(
|
|
96
|
-
self, encoded_files:
|
|
104
|
+
self, encoded_files: dict[str, str], embeddings: OpenAIEmbeddings
|
|
97
105
|
) -> FAISS:
|
|
98
106
|
"""Decode base64 files back to FAISS vector store."""
|
|
99
107
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
@@ -110,20 +118,18 @@ class VectorStoreManager:
|
|
|
110
118
|
allow_dangerous_deserialization=True,
|
|
111
119
|
)
|
|
112
120
|
|
|
113
|
-
async def get_existing_vector_store(self, agent_id: str) ->
|
|
121
|
+
async def get_existing_vector_store(self, agent_id: str) -> dict | None:
|
|
114
122
|
"""Get existing vector store data if it exists."""
|
|
115
123
|
vector_store_key, _ = self.get_storage_keys(agent_id)
|
|
116
|
-
return await
|
|
117
|
-
agent_id, "web_scraper", vector_store_key
|
|
118
|
-
)
|
|
124
|
+
return await AgentSkillData.get(agent_id, "web_scraper", vector_store_key)
|
|
119
125
|
|
|
120
126
|
async def merge_with_existing(
|
|
121
127
|
self,
|
|
122
|
-
new_documents:
|
|
128
|
+
new_documents: list[Document],
|
|
123
129
|
agent_id: str,
|
|
124
130
|
chunk_size: int = DEFAULT_CHUNK_SIZE,
|
|
125
131
|
chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
|
|
126
|
-
) ->
|
|
132
|
+
) -> tuple[FAISS, bool]:
|
|
127
133
|
"""
|
|
128
134
|
Merge new documents with existing vector store or create new one.
|
|
129
135
|
|
|
@@ -184,12 +190,13 @@ class VectorStoreManager:
|
|
|
184
190
|
|
|
185
191
|
try:
|
|
186
192
|
# Save to storage
|
|
187
|
-
|
|
193
|
+
skill_data = AgentSkillDataCreate(
|
|
188
194
|
agent_id=agent_id,
|
|
189
195
|
skill="web_scraper",
|
|
190
196
|
key=vector_store_key,
|
|
191
197
|
data=storage_data,
|
|
192
198
|
)
|
|
199
|
+
await skill_data.save()
|
|
193
200
|
|
|
194
201
|
logger.info(f"[{agent_id}] Successfully saved vector store")
|
|
195
202
|
|
|
@@ -197,7 +204,7 @@ class VectorStoreManager:
|
|
|
197
204
|
logger.error(f"[{agent_id}] Failed to save vector store: {e}")
|
|
198
205
|
raise
|
|
199
206
|
|
|
200
|
-
async def load_vector_store(self, agent_id: str) ->
|
|
207
|
+
async def load_vector_store(self, agent_id: str) -> FAISS | None:
|
|
201
208
|
"""Load vector store for an agent."""
|
|
202
209
|
stored_data = await self.get_existing_vector_store(agent_id)
|
|
203
210
|
|
|
@@ -226,7 +233,8 @@ class VectorStoreManager:
|
|
|
226
233
|
|
|
227
234
|
return total_size
|
|
228
235
|
|
|
229
|
-
|
|
236
|
+
@staticmethod
|
|
237
|
+
def format_size(size_bytes: int) -> str:
|
|
230
238
|
"""Format size in bytes to human readable format."""
|
|
231
239
|
if size_bytes < 1024:
|
|
232
240
|
return f"{size_bytes} B"
|
|
@@ -241,10 +249,10 @@ class DocumentProcessor:
|
|
|
241
249
|
|
|
242
250
|
@staticmethod
|
|
243
251
|
def create_chunks(
|
|
244
|
-
documents:
|
|
252
|
+
documents: list[Document],
|
|
245
253
|
chunk_size: int = DEFAULT_CHUNK_SIZE,
|
|
246
254
|
chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
|
|
247
|
-
) ->
|
|
255
|
+
) -> list[Document]:
|
|
248
256
|
"""Split documents into chunks."""
|
|
249
257
|
text_splitter = RecursiveCharacterTextSplitter(
|
|
250
258
|
chunk_size=chunk_size,
|
|
@@ -283,7 +291,7 @@ class DocumentProcessor:
|
|
|
283
291
|
title: str,
|
|
284
292
|
source: str,
|
|
285
293
|
tags: str = "",
|
|
286
|
-
extra_metadata:
|
|
294
|
+
extra_metadata: dict | None = None,
|
|
287
295
|
) -> Document:
|
|
288
296
|
"""Create a Document with standardized metadata."""
|
|
289
297
|
cleaned_content = DocumentProcessor.clean_text(content)
|
|
@@ -312,27 +320,21 @@ class DocumentProcessor:
|
|
|
312
320
|
class MetadataManager:
|
|
313
321
|
"""Manages metadata for indexed content."""
|
|
314
322
|
|
|
315
|
-
def __init__(self,
|
|
316
|
-
self.
|
|
323
|
+
def __init__(self, vector_manager: VectorStoreManager):
|
|
324
|
+
self._vector_manager = vector_manager
|
|
317
325
|
|
|
318
|
-
async def get_existing_metadata(self, agent_id: str) ->
|
|
326
|
+
async def get_existing_metadata(self, agent_id: str) -> dict:
|
|
319
327
|
"""Get existing metadata for an agent."""
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
return (
|
|
323
|
-
await self.skill_store.get_agent_skill_data(
|
|
324
|
-
agent_id, "web_scraper", metadata_key
|
|
325
|
-
)
|
|
326
|
-
or {}
|
|
327
|
-
)
|
|
328
|
+
_, metadata_key = self._vector_manager.get_storage_keys(agent_id)
|
|
329
|
+
return await AgentSkillData.get(agent_id, "web_scraper", metadata_key) or {}
|
|
328
330
|
|
|
329
331
|
def create_url_metadata(
|
|
330
332
|
self,
|
|
331
|
-
urls:
|
|
332
|
-
split_docs:
|
|
333
|
+
urls: list[str],
|
|
334
|
+
split_docs: list[Document],
|
|
333
335
|
source_type: str = "web_scraper",
|
|
334
|
-
extra_fields:
|
|
335
|
-
) ->
|
|
336
|
+
extra_fields: dict | None = None,
|
|
337
|
+
) -> dict:
|
|
336
338
|
"""Create metadata for a list of URLs."""
|
|
337
339
|
metadata = {}
|
|
338
340
|
current_time = str(asyncio.get_event_loop().time())
|
|
@@ -358,9 +360,9 @@ class MetadataManager:
|
|
|
358
360
|
title: str,
|
|
359
361
|
source: str,
|
|
360
362
|
tags: str,
|
|
361
|
-
split_docs:
|
|
363
|
+
split_docs: list[Document],
|
|
362
364
|
document_length: int,
|
|
363
|
-
) ->
|
|
365
|
+
) -> dict:
|
|
364
366
|
"""Create metadata for a document."""
|
|
365
367
|
# Generate unique key
|
|
366
368
|
key = f"document_{title.lower().replace(' ', '_')}"
|
|
@@ -379,10 +381,9 @@ class MetadataManager:
|
|
|
379
381
|
}
|
|
380
382
|
}
|
|
381
383
|
|
|
382
|
-
async def update_metadata(self, agent_id: str, new_metadata:
|
|
384
|
+
async def update_metadata(self, agent_id: str, new_metadata: dict) -> None:
|
|
383
385
|
"""Update metadata for an agent."""
|
|
384
|
-
|
|
385
|
-
_, metadata_key = vs_manager.get_storage_keys(agent_id)
|
|
386
|
+
_, metadata_key = self._vector_manager.get_storage_keys(agent_id)
|
|
386
387
|
|
|
387
388
|
# Get existing metadata
|
|
388
389
|
existing_metadata = await self.get_existing_metadata(agent_id)
|
|
@@ -391,12 +392,13 @@ class MetadataManager:
|
|
|
391
392
|
existing_metadata.update(new_metadata)
|
|
392
393
|
|
|
393
394
|
# Save updated metadata
|
|
394
|
-
|
|
395
|
+
skill_data = AgentSkillDataCreate(
|
|
395
396
|
agent_id=agent_id,
|
|
396
397
|
skill="web_scraper",
|
|
397
398
|
key=metadata_key,
|
|
398
399
|
data=existing_metadata,
|
|
399
400
|
)
|
|
401
|
+
await skill_data.save()
|
|
400
402
|
|
|
401
403
|
|
|
402
404
|
class ResponseFormatter:
|
|
@@ -405,12 +407,12 @@ class ResponseFormatter:
|
|
|
405
407
|
@staticmethod
|
|
406
408
|
def format_indexing_response(
|
|
407
409
|
operation_type: str,
|
|
408
|
-
urls_or_content:
|
|
410
|
+
urls_or_content: list[str] | str,
|
|
409
411
|
total_chunks: int,
|
|
410
412
|
chunk_size: int,
|
|
411
413
|
chunk_overlap: int,
|
|
412
414
|
was_merged: bool,
|
|
413
|
-
extra_info:
|
|
415
|
+
extra_info: dict | None = None,
|
|
414
416
|
current_size_bytes: int = 0,
|
|
415
417
|
size_limit_reached: bool = False,
|
|
416
418
|
total_requested_urls: int = 0,
|
|
@@ -457,9 +459,8 @@ class ResponseFormatter:
|
|
|
457
459
|
|
|
458
460
|
# Add size information
|
|
459
461
|
if current_size_bytes > 0:
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
max_size = vs_manager.format_size(MAX_CONTENT_SIZE_BYTES)
|
|
462
|
+
formatted_size = VectorStoreManager.format_size(current_size_bytes)
|
|
463
|
+
max_size = VectorStoreManager.format_size(MAX_CONTENT_SIZE_BYTES)
|
|
463
464
|
response_parts.append(
|
|
464
465
|
f"Current storage size: {formatted_size} / {max_size}"
|
|
465
466
|
)
|
|
@@ -479,20 +480,20 @@ class ResponseFormatter:
|
|
|
479
480
|
|
|
480
481
|
|
|
481
482
|
async def scrape_and_index_urls(
|
|
482
|
-
urls:
|
|
483
|
+
urls: list[str],
|
|
483
484
|
agent_id: str,
|
|
484
|
-
|
|
485
|
+
vector_manager: VectorStoreManager,
|
|
485
486
|
chunk_size: int = DEFAULT_CHUNK_SIZE,
|
|
486
487
|
chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
|
|
487
488
|
requests_per_second: int = DEFAULT_REQUESTS_PER_SECOND,
|
|
488
|
-
) ->
|
|
489
|
+
) -> tuple[int, bool, list[str]]:
|
|
489
490
|
"""
|
|
490
491
|
Scrape URLs and index their content into vector store with size limits.
|
|
491
492
|
|
|
492
493
|
Args:
|
|
493
494
|
urls: List of URLs to scrape
|
|
494
495
|
agent_id: Agent identifier for storage
|
|
495
|
-
|
|
496
|
+
vector_manager: Manager for vector store operations
|
|
496
497
|
chunk_size: Size of text chunks
|
|
497
498
|
chunk_overlap: Overlap between chunks
|
|
498
499
|
requests_per_second: Rate limiting for requests
|
|
@@ -520,16 +521,15 @@ async def scrape_and_index_urls(
|
|
|
520
521
|
return 0, False, []
|
|
521
522
|
|
|
522
523
|
# Check existing content size
|
|
523
|
-
|
|
524
|
-
current_size = await vs_manager.get_content_size(agent_id)
|
|
524
|
+
current_size = await vector_manager.get_content_size(agent_id)
|
|
525
525
|
|
|
526
526
|
logger.info(
|
|
527
|
-
f"[{agent_id}] Current storage size: {
|
|
527
|
+
f"[{agent_id}] Current storage size: {VectorStoreManager.format_size(current_size)}"
|
|
528
528
|
)
|
|
529
529
|
|
|
530
530
|
if current_size >= MAX_CONTENT_SIZE_BYTES:
|
|
531
531
|
logger.warning(
|
|
532
|
-
f"[{agent_id}] Storage limit already reached: {
|
|
532
|
+
f"[{agent_id}] Storage limit already reached: {VectorStoreManager.format_size(current_size)}"
|
|
533
533
|
)
|
|
534
534
|
return 0, False, []
|
|
535
535
|
|
|
@@ -599,7 +599,7 @@ async def scrape_and_index_urls(
|
|
|
599
599
|
|
|
600
600
|
# Process and index this URL's content
|
|
601
601
|
chunks, merged = await index_documents(
|
|
602
|
-
documents, agent_id,
|
|
602
|
+
documents, agent_id, vector_manager, chunk_size, chunk_overlap
|
|
603
603
|
)
|
|
604
604
|
|
|
605
605
|
if chunks > 0:
|
|
@@ -609,7 +609,7 @@ async def scrape_and_index_urls(
|
|
|
609
609
|
current_size += content_size
|
|
610
610
|
|
|
611
611
|
logger.info(
|
|
612
|
-
f"[{agent_id}] Processed {url}: {chunks} chunks, current size: {
|
|
612
|
+
f"[{agent_id}] Processed {url}: {chunks} chunks, current size: {VectorStoreManager.format_size(current_size)}"
|
|
613
613
|
)
|
|
614
614
|
|
|
615
615
|
# Add delay for rate limiting
|
|
@@ -635,12 +635,12 @@ async def scrape_and_index_urls(
|
|
|
635
635
|
|
|
636
636
|
# Convenience function that combines all operations
|
|
637
637
|
async def index_documents(
|
|
638
|
-
documents:
|
|
638
|
+
documents: list[Document],
|
|
639
639
|
agent_id: str,
|
|
640
|
-
|
|
640
|
+
vector_manager: VectorStoreManager,
|
|
641
641
|
chunk_size: int = DEFAULT_CHUNK_SIZE,
|
|
642
642
|
chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
|
|
643
|
-
) ->
|
|
643
|
+
) -> tuple[int, bool]:
|
|
644
644
|
"""
|
|
645
645
|
Complete document indexing workflow.
|
|
646
646
|
|
|
@@ -654,13 +654,12 @@ async def index_documents(
|
|
|
654
654
|
raise ValueError("No content could be processed into chunks")
|
|
655
655
|
|
|
656
656
|
# Handle vector store
|
|
657
|
-
|
|
658
|
-
vector_store, was_merged = await vs_manager.merge_with_existing(
|
|
657
|
+
vector_store, was_merged = await vector_manager.merge_with_existing(
|
|
659
658
|
split_docs, agent_id, chunk_size, chunk_overlap
|
|
660
659
|
)
|
|
661
660
|
|
|
662
661
|
# Save vector store
|
|
663
|
-
await
|
|
662
|
+
await vector_manager.save_vector_store(
|
|
664
663
|
vector_store, agent_id, chunk_size, chunk_overlap
|
|
665
664
|
)
|
|
666
665
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import List, Type
|
|
3
2
|
from urllib.parse import urljoin, urlparse
|
|
4
3
|
|
|
5
4
|
import httpx
|
|
@@ -44,11 +43,11 @@ class WebsiteIndexerInput(BaseModel):
|
|
|
44
43
|
ge=0,
|
|
45
44
|
le=1000,
|
|
46
45
|
)
|
|
47
|
-
include_patterns:
|
|
46
|
+
include_patterns: list[str] = Field(
|
|
48
47
|
description="URL patterns to include (e.g., ['/blog/', '/docs/']). If empty, all URLs are included",
|
|
49
48
|
default=[],
|
|
50
49
|
)
|
|
51
|
-
exclude_patterns:
|
|
50
|
+
exclude_patterns: list[str] = Field(
|
|
52
51
|
description="URL patterns to exclude (e.g., ['/admin/', '/private/'])",
|
|
53
52
|
default=[],
|
|
54
53
|
)
|
|
@@ -68,7 +67,7 @@ class WebsiteIndexer(WebScraperBaseTool):
|
|
|
68
67
|
"This tool finds sitemaps from robots.txt, parses the XML content to extract URLs, "
|
|
69
68
|
"and then uses the reliable scrape_and_index functionality for content indexing."
|
|
70
69
|
)
|
|
71
|
-
args_schema:
|
|
70
|
+
args_schema: type[BaseModel] = WebsiteIndexerInput
|
|
72
71
|
|
|
73
72
|
def _normalize_url(self, url: str) -> str:
|
|
74
73
|
"""Normalize URL by ensuring it has a proper scheme."""
|
|
@@ -106,7 +105,7 @@ class WebsiteIndexer(WebScraperBaseTool):
|
|
|
106
105
|
|
|
107
106
|
def _extract_sitemaps_from_robots(
|
|
108
107
|
self, robots_content: str, base_url: str
|
|
109
|
-
) ->
|
|
108
|
+
) -> list[str]:
|
|
110
109
|
"""Extract sitemap URLs from robots.txt content."""
|
|
111
110
|
sitemaps = []
|
|
112
111
|
|
|
@@ -121,7 +120,7 @@ class WebsiteIndexer(WebScraperBaseTool):
|
|
|
121
120
|
|
|
122
121
|
return sitemaps
|
|
123
122
|
|
|
124
|
-
def _get_common_sitemap_patterns(self, base_url: str) ->
|
|
123
|
+
def _get_common_sitemap_patterns(self, base_url: str) -> list[str]:
|
|
125
124
|
"""Generate common sitemap URL patterns."""
|
|
126
125
|
return [
|
|
127
126
|
urljoin(base_url, "/sitemap.xml"),
|
|
@@ -157,7 +156,7 @@ class WebsiteIndexer(WebScraperBaseTool):
|
|
|
157
156
|
logger.warning(f"Could not fetch sitemap from {sitemap_url}: {e}")
|
|
158
157
|
return ""
|
|
159
158
|
|
|
160
|
-
async def _get_all_sitemap_content(self, base_url: str) -> tuple[str,
|
|
159
|
+
async def _get_all_sitemap_content(self, base_url: str) -> tuple[str, list[str]]:
|
|
161
160
|
"""Get all sitemap content for AI analysis."""
|
|
162
161
|
all_content = []
|
|
163
162
|
found_sitemaps = []
|
|
@@ -200,7 +199,7 @@ class WebsiteIndexer(WebScraperBaseTool):
|
|
|
200
199
|
return combined_xml, found_sitemaps
|
|
201
200
|
|
|
202
201
|
def _create_ai_extraction_prompt(
|
|
203
|
-
self, sitemap_xml: str, include_patterns:
|
|
202
|
+
self, sitemap_xml: str, include_patterns: list[str], exclude_patterns: list[str]
|
|
204
203
|
) -> str:
|
|
205
204
|
"""Create a prompt for AI to extract URLs from sitemap XML."""
|
|
206
205
|
filter_instructions = ""
|
|
@@ -225,7 +224,7 @@ INSTRUCTIONS:
|
|
|
225
224
|
|
|
226
225
|
Extract the URLs now:"""
|
|
227
226
|
|
|
228
|
-
def _parse_ai_response(self, ai_response: str) ->
|
|
227
|
+
def _parse_ai_response(self, ai_response: str) -> list[str]:
|
|
229
228
|
"""Parse AI response to extract clean URLs."""
|
|
230
229
|
urls = []
|
|
231
230
|
|
|
@@ -250,10 +249,7 @@ Extract the URLs now:"""
|
|
|
250
249
|
"""Call OpenAI GPT-4o-mini to extract URLs from sitemap content."""
|
|
251
250
|
try:
|
|
252
251
|
# Get OpenAI API key using the standard pattern
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
temp_tool = OpenAIBaseTool(skill_store=self.skill_store)
|
|
256
|
-
api_key = temp_tool.get_api_key()
|
|
252
|
+
api_key = self.get_openai_api_key()
|
|
257
253
|
|
|
258
254
|
# Initialize OpenAI client
|
|
259
255
|
client = openai.AsyncOpenAI(api_key=api_key)
|
|
@@ -284,8 +280,8 @@ Extract the URLs now:"""
|
|
|
284
280
|
max_urls: int = 50,
|
|
285
281
|
chunk_size: int = DEFAULT_CHUNK_SIZE,
|
|
286
282
|
chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
|
|
287
|
-
include_patterns:
|
|
288
|
-
exclude_patterns:
|
|
283
|
+
include_patterns: list[str] = None,
|
|
284
|
+
exclude_patterns: list[str] = None,
|
|
289
285
|
**kwargs,
|
|
290
286
|
) -> str:
|
|
291
287
|
"""Discover website sitemaps, extract URLs with AI, and delegate to scrape_and_index."""
|
|
@@ -385,9 +381,12 @@ Extract the URLs now:"""
|
|
|
385
381
|
f"[{agent_id}] Extracted {len(unique_urls)} URLs from sitemaps. Scraping and indexing..."
|
|
386
382
|
)
|
|
387
383
|
|
|
384
|
+
embedding_api_key = self.get_openai_api_key()
|
|
385
|
+
vector_manager = VectorStoreManager(embedding_api_key)
|
|
386
|
+
|
|
388
387
|
# Use the utility function to scrape and index URLs directly
|
|
389
388
|
total_chunks, was_merged, valid_urls = await scrape_and_index_urls(
|
|
390
|
-
unique_urls, agent_id,
|
|
389
|
+
unique_urls, agent_id, vector_manager, chunk_size, chunk_overlap
|
|
391
390
|
)
|
|
392
391
|
|
|
393
392
|
if total_chunks == 0:
|
|
@@ -397,12 +396,11 @@ Extract the URLs now:"""
|
|
|
397
396
|
return f"Error: No content could be extracted from the discovered URLs. Found sitemaps: {', '.join(found_sitemaps)}"
|
|
398
397
|
|
|
399
398
|
# Get current storage size for response
|
|
400
|
-
|
|
401
|
-
current_size = await vs_manager.get_content_size(agent_id)
|
|
399
|
+
current_size = await vector_manager.get_content_size(agent_id)
|
|
402
400
|
size_limit_reached = len(valid_urls) < len(unique_urls)
|
|
403
401
|
|
|
404
402
|
# Update metadata
|
|
405
|
-
metadata_manager = MetadataManager(
|
|
403
|
+
metadata_manager = MetadataManager(vector_manager)
|
|
406
404
|
new_metadata = metadata_manager.create_url_metadata(
|
|
407
405
|
valid_urls, [], "website_indexer"
|
|
408
406
|
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""WETH AgentKit skills."""
|
|
2
|
+
|
|
3
|
+
from typing import TypedDict
|
|
4
|
+
|
|
5
|
+
from coinbase_agentkit import weth_action_provider
|
|
6
|
+
|
|
7
|
+
from intentkit.models.agent import Agent
|
|
8
|
+
from intentkit.skills.base import (
|
|
9
|
+
SkillConfig,
|
|
10
|
+
SkillState,
|
|
11
|
+
action_to_structured_tool,
|
|
12
|
+
get_agentkit_actions,
|
|
13
|
+
)
|
|
14
|
+
from intentkit.skills.weth.base import WethBaseTool
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SkillStates(TypedDict):
|
|
18
|
+
WethActionProvider_wrap_eth: SkillState
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Config(SkillConfig):
|
|
22
|
+
"""Configuration for WETH skills."""
|
|
23
|
+
|
|
24
|
+
states: SkillStates
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def get_skills(
|
|
28
|
+
config: Config,
|
|
29
|
+
is_private: bool,
|
|
30
|
+
agent_id: str,
|
|
31
|
+
agent: Agent | None = None,
|
|
32
|
+
**_,
|
|
33
|
+
) -> list[WethBaseTool]:
|
|
34
|
+
"""Get all WETH skills."""
|
|
35
|
+
|
|
36
|
+
available_skills: list[str] = []
|
|
37
|
+
for skill_name, state in config["states"].items():
|
|
38
|
+
if state == "disabled":
|
|
39
|
+
continue
|
|
40
|
+
if state == "public" or (state == "private" and is_private):
|
|
41
|
+
available_skills.append(skill_name)
|
|
42
|
+
|
|
43
|
+
actions = await get_agentkit_actions(agent_id, [weth_action_provider], agent=agent)
|
|
44
|
+
tools: list[WethBaseTool] = []
|
|
45
|
+
for skill in available_skills:
|
|
46
|
+
for action in actions:
|
|
47
|
+
if action.name.endswith(skill):
|
|
48
|
+
tools.append(action_to_structured_tool(action))
|
|
49
|
+
return tools
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "WETH",
|
|
5
|
+
"description": "Wrap ETH actions via Coinbase AgentKit",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/weth/weth.svg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"Crypto",
|
|
9
|
+
"DeFi"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"enabled": {
|
|
13
|
+
"type": "boolean",
|
|
14
|
+
"title": "Enabled",
|
|
15
|
+
"description": "Whether this skill is enabled",
|
|
16
|
+
"default": false
|
|
17
|
+
},
|
|
18
|
+
"states": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"properties": {
|
|
21
|
+
"WethActionProvider_wrap_eth": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"title": "Wrap ETH",
|
|
24
|
+
"enum": [
|
|
25
|
+
"disabled",
|
|
26
|
+
"public",
|
|
27
|
+
"private"
|
|
28
|
+
],
|
|
29
|
+
"x-enum-title": [
|
|
30
|
+
"Disabled",
|
|
31
|
+
"Agent Owner + All Users",
|
|
32
|
+
"Agent Owner Only"
|
|
33
|
+
],
|
|
34
|
+
"description": "State for WethActionProvider_wrap_eth",
|
|
35
|
+
"default": "disabled"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"description": "States for each WETH skill (disabled, public, or private)"
|
|
39
|
+
},
|
|
40
|
+
"api_key_provider": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"title": "API Key Provider",
|
|
43
|
+
"description": "Who provides the API key",
|
|
44
|
+
"enum": [
|
|
45
|
+
"platform"
|
|
46
|
+
],
|
|
47
|
+
"x-enum-title": [
|
|
48
|
+
"Nation Hosted"
|
|
49
|
+
],
|
|
50
|
+
"default": "platform"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"required": [
|
|
54
|
+
"states",
|
|
55
|
+
"enabled"
|
|
56
|
+
],
|
|
57
|
+
"additionalProperties": true
|
|
58
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
|
2
|
+
<rect width="128" height="128" fill="#1a237e" rx="16" />
|
|
3
|
+
<polygon points="64,20 88,48 64,76 40,48" fill="#8c9eff" />
|
|
4
|
+
<polygon points="64,56 88,84 64,112 40,84" fill="#536dfe" />
|
|
5
|
+
<text x="50%" y="122" font-family="Arial,Helvetica,sans-serif" font-size="20" fill="#c5cae9" text-anchor="middle">WETH</text>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""WOW AgentKit skills."""
|
|
2
|
+
|
|
3
|
+
from typing import TypedDict
|
|
4
|
+
|
|
5
|
+
from coinbase_agentkit import wow_action_provider
|
|
6
|
+
|
|
7
|
+
from intentkit.models.agent import Agent
|
|
8
|
+
from intentkit.skills.base import (
|
|
9
|
+
SkillConfig,
|
|
10
|
+
SkillState,
|
|
11
|
+
action_to_structured_tool,
|
|
12
|
+
get_agentkit_actions,
|
|
13
|
+
)
|
|
14
|
+
from intentkit.skills.wow.base import WowBaseTool
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SkillStates(TypedDict):
|
|
18
|
+
WowActionProvider_buy_token: SkillState
|
|
19
|
+
WowActionProvider_create_token: SkillState
|
|
20
|
+
WowActionProvider_sell_token: SkillState
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Config(SkillConfig):
|
|
24
|
+
"""Configuration for WOW skills."""
|
|
25
|
+
|
|
26
|
+
states: SkillStates
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def get_skills(
|
|
30
|
+
config: Config,
|
|
31
|
+
is_private: bool,
|
|
32
|
+
agent_id: str,
|
|
33
|
+
agent: Agent | None = None,
|
|
34
|
+
**_,
|
|
35
|
+
) -> list[WowBaseTool]:
|
|
36
|
+
"""Get all WOW skills."""
|
|
37
|
+
|
|
38
|
+
available_skills: list[str] = []
|
|
39
|
+
for skill_name, state in config["states"].items():
|
|
40
|
+
if state == "disabled":
|
|
41
|
+
continue
|
|
42
|
+
if state == "public" or (state == "private" and is_private):
|
|
43
|
+
available_skills.append(skill_name)
|
|
44
|
+
|
|
45
|
+
actions = await get_agentkit_actions(agent_id, [wow_action_provider], agent=agent)
|
|
46
|
+
tools: list[WowBaseTool] = []
|
|
47
|
+
for skill in available_skills:
|
|
48
|
+
for action in actions:
|
|
49
|
+
if action.name.endswith(skill):
|
|
50
|
+
tools.append(action_to_structured_tool(action))
|
|
51
|
+
return tools
|