intentkit 0.6.0.dev7__tar.gz → 0.6.0.dev8__tar.gz
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-0.6.0.dev7 → intentkit-0.6.0.dev8}/PKG-INFO +1 -1
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/__init__.py +1 -1
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/pyproject.toml +1 -1
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/web_scraper/README.md +35 -4
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/web_scraper/__init__.py +16 -0
- intentkit-0.6.0.dev8/skills/web_scraper/document_indexer.py +143 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/web_scraper/schema.json +28 -0
- intentkit-0.6.0.dev8/skills/web_scraper/scrape_and_index.py +262 -0
- intentkit-0.6.0.dev8/skills/web_scraper/utils.py +641 -0
- intentkit-0.6.0.dev8/skills/web_scraper/website_indexer.py +426 -0
- intentkit-0.6.0.dev7/skills/web_scraper/scrape_and_index.py +0 -327
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/.gitignore +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/LICENSE +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/MANIFEST.in +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/agent.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/api.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/engine.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/exception.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/graph.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/skill.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/abstracts/twitter.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/clients/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/clients/cdp.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/clients/twitter.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/config/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/config/config.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/agent.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/api.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/client.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/credit.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/engine.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/node.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/prompt.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/core/skill.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/agent.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/agent_data.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/agent_schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/app_setting.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/chat.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/conversation.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/credit.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/db.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/db_mig.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/generator.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/llm.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/redis.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/skill.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/models/user.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/acolyt/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/acolyt/acolyt.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/acolyt/ask.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/acolyt/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/acolyt/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/aixbt/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/aixbt/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/aixbt/aixbt.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/aixbt/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/aixbt/projects.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/aixbt/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/allora/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/allora/allora.jpeg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/allora/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/allora/price.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/allora/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/carv.webp +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/fetch_news.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/onchain_query.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/carv/token_info_and_price.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cdp/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cdp/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cdp/cdp.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cdp/get_balance.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cdp/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/chainlist/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/chainlist/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/chainlist/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/chainlist/chain_lookup.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/chainlist/chainlist.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/chainlist/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/common/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/common/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/common/common.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/common/current_time.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/common/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/constants.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/cookiefun.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/get_account_details.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/get_account_feed.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/get_account_smart_followers.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/get_sectors.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cookiefun/search_accounts.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/api.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/cryptocompare.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/fetch_news.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/fetch_price.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/fetch_top_exchanges.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/fetch_top_market_cap.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/fetch_top_volume.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/fetch_trading_signals.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptocompare/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptopanic/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptopanic/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptopanic/cryptopanic.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptopanic/fetch_crypto_news.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptopanic/fetch_crypto_sentiment.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/cryptopanic/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dapplooker/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dapplooker/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dapplooker/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dapplooker/dapplooker.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dapplooker/dapplooker_token_data.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dapplooker/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/api.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_batch_historical_prices.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_block.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_current_prices.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_first_price.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_historical_prices.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_price_chart.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/coins/fetch_price_percentage.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/config/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/config/chains.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/defillama.jpeg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/fees/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/fees/fetch_fees_overview.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/stablecoins/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/stablecoins/fetch_stablecoin_chains.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/stablecoins/fetch_stablecoin_charts.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/stablecoins/fetch_stablecoin_prices.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/stablecoins/fetch_stablecoins.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tests/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tests/api_integration.test.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tests/api_unit.test.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/fetch_chain_historical_tvl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/fetch_chains.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/fetch_historical_tvl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/fetch_protocol.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/fetch_protocol_current_tvl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/tvl/fetch_protocols.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/volumes/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/volumes/fetch_dex_overview.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/volumes/fetch_dex_summary.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/volumes/fetch_options_overview.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/yields/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/yields/fetch_pool_chart.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/defillama/yields/fetch_pools.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/dexscreener.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/model/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/model/search_token_response.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dexscreener/search_token.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dune_analytics/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dune_analytics/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dune_analytics/dune.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dune_analytics/fetch_kol_buys.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dune_analytics/fetch_nation_metrics.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/dune_analytics/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/elfa.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/mention.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/stats.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/elfa/tokens.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/abi/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/abi/approval.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/abi/erc20.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/abi/route.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/best_yield.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/enso.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/networks.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/prices.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/route.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/tokens.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/enso/wallet.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/github/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/github/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/github/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/github/github.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/github/github_search.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/github/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/heurist.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_animagine_xl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_arthemy_comics.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_arthemy_real.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_braindance.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_cyber_realistic_xl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_flux_1_dev.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/image_generation_sdxl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/heurist/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/lifi.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/token_execute.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/token_quote.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/lifi/utils.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/api.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/fetch_chain_portfolio.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/fetch_nft_portfolio.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/fetch_solana_portfolio.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/fetch_wallet_portfolio.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/moralis.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/tests/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/moralis/tests/test_wallet.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/nation/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/nation/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/nation/nation.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/nation/nft_check.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/nation/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/dalle_image_generation.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/gpt_image_generation.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/gpt_image_to_image.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/image_to_text.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/openai.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/openai/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/constants.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/moralis.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/token_balances.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_approvals.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_defi_positions.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_history.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_net_worth.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_nfts.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_profitability.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_profitability_summary.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_stats.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/portfolio/wallet_swaps.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/skills.toml +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/get_channel.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/get_message.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/schedule_message.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/send_message.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/slack/slack.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/system/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/system/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/system/read_agent_api_key.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/system/regenerate_agent_api_key.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/system/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/system/system.svg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/tavily.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/tavily_extract.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/tavily/tavily_search.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/constants.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/erc20_transfers.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/moralis.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/token_analytics.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/token_price.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/token/token_search.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/follow_user.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/get_mentions.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/get_timeline.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/get_user_by_username.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/get_user_tweets.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/like_tweet.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/post_tweet.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/reply_tweet.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/retweet.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/search_tweets.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/twitter/twitter.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/unrealspeech/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/unrealspeech/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/unrealspeech/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/unrealspeech/text_to_speech.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/unrealspeech/unrealspeech.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_audio/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_audio/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_audio/input.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_audio/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_audio/venice_audio.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_audio/venice_logo.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/api.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/config.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_enhance/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_enhance/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_enhance/image_enhance.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_enhance/image_enhance_base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_enhance/image_enhance_input.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_fluently_xl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_flux_dev.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_input.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_pony_realism.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_generation/image_generation_venice_sd35.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_upscale/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_upscale/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_upscale/image_upscale.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_upscale/image_upscale_base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_upscale/image_upscale_input.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_vision/README.md +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_vision/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_vision/image_vision.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_vision/image_vision_base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/image_vision/image_vision_input.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/schema.json +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/utils.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/venice_image/venice_image.jpg +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/web_scraper/base.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/skills/web_scraper/langchain.png +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/__init__.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/chain.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/error.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/logging.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/middleware.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/random.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/s3.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/slack_alert.py +0 -0
- {intentkit-0.6.0.dev7 → intentkit-0.6.0.dev8}/utils/tx.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: intentkit
|
|
3
|
-
Version: 0.6.0.
|
|
3
|
+
Version: 0.6.0.dev8
|
|
4
4
|
Summary: Intent-based AI Agent Platform - Core Package
|
|
5
5
|
Project-URL: Homepage, https://github.com/crestal-network/intentkit
|
|
6
6
|
Project-URL: Repository, https://github.com/crestal-network/intentkit
|
|
@@ -10,12 +10,22 @@ Scrape content from URLs and index into a searchable vector store with configura
|
|
|
10
10
|
### 🔎 `query_indexed_content`
|
|
11
11
|
Search indexed content using semantic similarity to answer questions and retrieve relevant information.
|
|
12
12
|
|
|
13
|
+
### `website_indexer`
|
|
14
|
+
Index entire websites by discovering and scraping all pages using sitemaps. Automatically finds sitemaps from robots.txt, extracts all URLs, and comprehensively indexes website content.
|
|
15
|
+
|
|
16
|
+
### `document_indexer`
|
|
17
|
+
Import and index document content directly to the vector database. Perfect for adding content from Google Docs, Notion pages, PDFs, or any other document sources by copy-pasting.
|
|
18
|
+
|
|
13
19
|
## Key Features
|
|
14
20
|
|
|
15
|
-
- **Multi-URL Support**: Scrape up to 10 URLs simultaneously
|
|
21
|
+
- **Multi-URL Support**: Scrape up to 10 URLs simultaneously
|
|
22
|
+
- **Sitemap Discovery**: Automatic sitemap detection from robots.txt with common patterns
|
|
23
|
+
- **Direct Text Input**: Add content directly without web scraping
|
|
16
24
|
- **Smart Chunking**: Configurable text splitting (100-4000 chars) with overlap
|
|
17
25
|
- **Vector Search**: FAISS + OpenAI embeddings for semantic retrieval
|
|
18
26
|
- **Agent Storage**: Persistent, per-agent content indexing
|
|
27
|
+
- **Content Filtering**: Include/exclude URL patterns for targeted scraping
|
|
28
|
+
- **Tagging System**: Organize content with custom tags
|
|
19
29
|
- **Rate Limiting**: Respectful scraping (0.1-10 req/sec)
|
|
20
30
|
|
|
21
31
|
## Testing Examples
|
|
@@ -39,7 +49,27 @@ Please scrape and index this URL: https://docs.crestal.network/introduction
|
|
|
39
49
|
Scrape and index https://docs.crestal.network/introduction with chunk size 500 and overlap 100.
|
|
40
50
|
```
|
|
41
51
|
|
|
42
|
-
### 3.
|
|
52
|
+
### 3. Complete Website Indexing
|
|
53
|
+
|
|
54
|
+
**Agent Prompt:**
|
|
55
|
+
```
|
|
56
|
+
Index the entire documentation site at https://docs.crestal.network using its sitemap. Include only pages with '/docs/' and '/guides/' in the URL, exclude '/admin/' pages, and limit to 50 URLs.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 4. Document Content Import
|
|
60
|
+
|
|
61
|
+
**Agent Prompt:**
|
|
62
|
+
```
|
|
63
|
+
I'm going to paste some content from my Google Doc. Please add it to the knowledge base:
|
|
64
|
+
|
|
65
|
+
Title: "Meeting Notes - Q4 Strategy"
|
|
66
|
+
Source: "Google Docs"
|
|
67
|
+
Tags: "meeting, strategy, q4, planning"
|
|
68
|
+
|
|
69
|
+
[Paste your document content here...]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 5. Content Querying
|
|
43
73
|
|
|
44
74
|
**Agent Prompt (after indexing):**
|
|
45
75
|
```
|
|
@@ -75,8 +105,9 @@ curl -X POST "http://localhost:8000/agents/your-agent-id/chat" \
|
|
|
75
105
|
## Dependencies
|
|
76
106
|
|
|
77
107
|
Required packages (add to `pyproject.toml` if missing):
|
|
78
|
-
- `langchain-community` - WebBaseLoader
|
|
108
|
+
- `langchain-community` - WebBaseLoader and document processing
|
|
79
109
|
- `langchain-openai` - Embeddings
|
|
80
110
|
- `langchain-text-splitters` - Document chunking
|
|
81
111
|
- `faiss-cpu` - Vector storage
|
|
82
|
-
- `beautifulsoup4` - HTML parsing
|
|
112
|
+
- `beautifulsoup4` - HTML parsing
|
|
113
|
+
- `httpx` - Async HTTP client for sitemap discovery
|
|
@@ -6,10 +6,12 @@ from typing import TypedDict
|
|
|
6
6
|
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
7
|
from intentkit.skills.base import SkillConfig, SkillOwnerState, SkillState
|
|
8
8
|
from intentkit.skills.web_scraper.base import WebScraperBaseTool
|
|
9
|
+
from intentkit.skills.web_scraper.document_indexer import DocumentIndexer
|
|
9
10
|
from intentkit.skills.web_scraper.scrape_and_index import (
|
|
10
11
|
QueryIndexedContent,
|
|
11
12
|
ScrapeAndIndex,
|
|
12
13
|
)
|
|
14
|
+
from intentkit.skills.web_scraper.website_indexer import WebsiteIndexer
|
|
13
15
|
|
|
14
16
|
# Cache skills at the system level, because they are stateless
|
|
15
17
|
_cache: dict[str, WebScraperBaseTool] = {}
|
|
@@ -20,6 +22,8 @@ logger = logging.getLogger(__name__)
|
|
|
20
22
|
class SkillStates(TypedDict):
|
|
21
23
|
scrape_and_index: SkillOwnerState
|
|
22
24
|
query_indexed_content: SkillState
|
|
25
|
+
website_indexer: SkillOwnerState
|
|
26
|
+
document_indexer: SkillOwnerState
|
|
23
27
|
|
|
24
28
|
|
|
25
29
|
class Config(SkillConfig):
|
|
@@ -87,6 +91,18 @@ def get_web_scraper_skill(
|
|
|
87
91
|
skill_store=store,
|
|
88
92
|
)
|
|
89
93
|
return _cache[name]
|
|
94
|
+
elif name == "website_indexer":
|
|
95
|
+
if name not in _cache:
|
|
96
|
+
_cache[name] = WebsiteIndexer(
|
|
97
|
+
skill_store=store,
|
|
98
|
+
)
|
|
99
|
+
return _cache[name]
|
|
100
|
+
elif name == "document_indexer":
|
|
101
|
+
if name not in _cache:
|
|
102
|
+
_cache[name] = DocumentIndexer(
|
|
103
|
+
skill_store=store,
|
|
104
|
+
)
|
|
105
|
+
return _cache[name]
|
|
90
106
|
else:
|
|
91
107
|
logger.warning(f"Unknown web scraper skill: {name}")
|
|
92
108
|
return None
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.web_scraper.base import WebScraperBaseTool
|
|
8
|
+
from intentkit.skills.web_scraper.utils import (
|
|
9
|
+
DocumentProcessor,
|
|
10
|
+
MetadataManager,
|
|
11
|
+
ResponseFormatter,
|
|
12
|
+
VectorStoreManager,
|
|
13
|
+
index_documents,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DocumentIndexerInput(BaseModel):
|
|
20
|
+
"""Input for DocumentIndexer tool."""
|
|
21
|
+
|
|
22
|
+
text_content: str = Field(
|
|
23
|
+
description="The text content to add to the vector database. Can be content from Google Docs, Notion, or any other text source",
|
|
24
|
+
min_length=10,
|
|
25
|
+
max_length=100000,
|
|
26
|
+
)
|
|
27
|
+
title: str = Field(
|
|
28
|
+
description="Title or name for this text content (will be used as metadata)",
|
|
29
|
+
max_length=200,
|
|
30
|
+
)
|
|
31
|
+
source: str = Field(
|
|
32
|
+
description="Source of the text content (e.g., 'Google Doc', 'Notion Page', 'Manual Entry')",
|
|
33
|
+
default="Manual Entry",
|
|
34
|
+
max_length=100,
|
|
35
|
+
)
|
|
36
|
+
chunk_size: int = Field(
|
|
37
|
+
description="Size of text chunks for indexing (default: 1000)",
|
|
38
|
+
default=1000,
|
|
39
|
+
ge=100,
|
|
40
|
+
le=4000,
|
|
41
|
+
)
|
|
42
|
+
chunk_overlap: int = Field(
|
|
43
|
+
description="Overlap between chunks (default: 200)",
|
|
44
|
+
default=200,
|
|
45
|
+
ge=0,
|
|
46
|
+
le=1000,
|
|
47
|
+
)
|
|
48
|
+
tags: str = Field(
|
|
49
|
+
description="Optional tags for categorizing the content (comma-separated)",
|
|
50
|
+
default="",
|
|
51
|
+
max_length=500,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class DocumentIndexer(WebScraperBaseTool):
|
|
56
|
+
"""Tool for importing and indexing document content to the vector database.
|
|
57
|
+
|
|
58
|
+
This tool allows users to copy and paste document content from various sources
|
|
59
|
+
(like Google Docs, Notion, PDFs, etc.) and index it directly into the vector store
|
|
60
|
+
for later querying and retrieval.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
name: str = "web_scraper_document_indexer"
|
|
64
|
+
description: str = (
|
|
65
|
+
"Import and index document content directly to the vector database. "
|
|
66
|
+
"Perfect for adding content from Google Docs, Notion pages, PDFs, or any other document sources. "
|
|
67
|
+
"The indexed content can then be queried using the query_indexed_content tool."
|
|
68
|
+
)
|
|
69
|
+
args_schema: Type[BaseModel] = DocumentIndexerInput
|
|
70
|
+
|
|
71
|
+
async def _arun(
|
|
72
|
+
self,
|
|
73
|
+
text_content: str,
|
|
74
|
+
title: str,
|
|
75
|
+
source: str = "Manual Entry",
|
|
76
|
+
chunk_size: int = 1000,
|
|
77
|
+
chunk_overlap: int = 200,
|
|
78
|
+
tags: str = "",
|
|
79
|
+
config: RunnableConfig = None,
|
|
80
|
+
**kwargs,
|
|
81
|
+
) -> str:
|
|
82
|
+
"""Add text content to the vector database."""
|
|
83
|
+
# Get agent context - throw error if not available
|
|
84
|
+
if not config:
|
|
85
|
+
raise ValueError("Configuration is required but not provided")
|
|
86
|
+
|
|
87
|
+
context = self.context_from_config(config)
|
|
88
|
+
if not context or not context.agent or not context.agent.id:
|
|
89
|
+
raise ValueError("Agent ID is required but not found in configuration")
|
|
90
|
+
|
|
91
|
+
agent_id = context.agent.id
|
|
92
|
+
|
|
93
|
+
logger.info(f"[{agent_id}] Starting document indexing for title: '{title}'")
|
|
94
|
+
|
|
95
|
+
# Validate content
|
|
96
|
+
if not DocumentProcessor.validate_content(text_content):
|
|
97
|
+
logger.error(f"[{agent_id}] Content validation failed - too short")
|
|
98
|
+
return "Error: Text content is too short. Please provide at least 10 characters of content."
|
|
99
|
+
|
|
100
|
+
# Create document with metadata
|
|
101
|
+
document = DocumentProcessor.create_document(
|
|
102
|
+
text_content,
|
|
103
|
+
title,
|
|
104
|
+
source,
|
|
105
|
+
tags,
|
|
106
|
+
extra_metadata={"source_type": "document_indexer"},
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
logger.info(
|
|
110
|
+
f"[{agent_id}] Document created, length: {len(document.page_content)} chars"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Index the document
|
|
114
|
+
total_chunks, was_merged = await index_documents(
|
|
115
|
+
[document], agent_id, self.skill_store, chunk_size, chunk_overlap
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Get current storage size for response
|
|
119
|
+
vs_manager = VectorStoreManager(self.skill_store)
|
|
120
|
+
current_size = await vs_manager.get_content_size(agent_id)
|
|
121
|
+
|
|
122
|
+
# Update metadata
|
|
123
|
+
metadata_manager = MetadataManager(self.skill_store)
|
|
124
|
+
new_metadata = metadata_manager.create_document_metadata(
|
|
125
|
+
title, source, tags, [document], len(text_content)
|
|
126
|
+
)
|
|
127
|
+
await metadata_manager.update_metadata(agent_id, new_metadata)
|
|
128
|
+
|
|
129
|
+
logger.info(f"[{agent_id}] Document indexing completed successfully")
|
|
130
|
+
|
|
131
|
+
# Format response
|
|
132
|
+
response = ResponseFormatter.format_indexing_response(
|
|
133
|
+
"indexed",
|
|
134
|
+
f"Document: {title}",
|
|
135
|
+
total_chunks,
|
|
136
|
+
chunk_size,
|
|
137
|
+
chunk_overlap,
|
|
138
|
+
was_merged,
|
|
139
|
+
current_size_bytes=current_size,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
logger.info(f"[{agent_id}] Document indexing completed successfully")
|
|
143
|
+
return response
|
|
@@ -50,6 +50,34 @@
|
|
|
50
50
|
],
|
|
51
51
|
"description": "Search and retrieve relevant information from previously indexed web content using semantic similarity. Perfect for answering questions based on scraped documents.",
|
|
52
52
|
"default": "private"
|
|
53
|
+
},
|
|
54
|
+
"website_indexer": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"title": "Complete Website Indexer",
|
|
57
|
+
"enum": [
|
|
58
|
+
"disabled",
|
|
59
|
+
"private"
|
|
60
|
+
],
|
|
61
|
+
"x-enum-title": [
|
|
62
|
+
"Disabled",
|
|
63
|
+
"Agent Owner Only"
|
|
64
|
+
],
|
|
65
|
+
"description": "Index entire websites by discovering and scraping all pages using sitemaps. Automatically finds sitemaps from robots.txt, extracts all URLs, and comprehensively indexes website content.",
|
|
66
|
+
"default": "private"
|
|
67
|
+
},
|
|
68
|
+
"document_indexer": {
|
|
69
|
+
"type": "string",
|
|
70
|
+
"title": "Document Content Indexer",
|
|
71
|
+
"enum": [
|
|
72
|
+
"disabled",
|
|
73
|
+
"private"
|
|
74
|
+
],
|
|
75
|
+
"x-enum-title": [
|
|
76
|
+
"Disabled",
|
|
77
|
+
"Agent Owner Only"
|
|
78
|
+
],
|
|
79
|
+
"description": "Import and index document content directly to the vector database. Perfect for adding content from Google Docs, Notion pages, PDFs, or any other document sources by copy-pasting.",
|
|
80
|
+
"default": "private"
|
|
53
81
|
}
|
|
54
82
|
},
|
|
55
83
|
"description": "Configure the availability of each web scraper skill (disabled, public, or private)"
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import List, Type
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.web_scraper.base import WebScraperBaseTool
|
|
8
|
+
from intentkit.skills.web_scraper.utils import (
|
|
9
|
+
DEFAULT_CHUNK_OVERLAP,
|
|
10
|
+
DEFAULT_CHUNK_SIZE,
|
|
11
|
+
MetadataManager,
|
|
12
|
+
ResponseFormatter,
|
|
13
|
+
VectorStoreManager,
|
|
14
|
+
scrape_and_index_urls,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ScrapeAndIndexInput(BaseModel):
|
|
21
|
+
"""Input for ScrapeAndIndex tool."""
|
|
22
|
+
|
|
23
|
+
urls: List[str] = Field(
|
|
24
|
+
description="List of URLs to scrape and index. Each URL should be a valid web address starting with http:// or https://",
|
|
25
|
+
min_items=1,
|
|
26
|
+
max_items=10,
|
|
27
|
+
)
|
|
28
|
+
chunk_size: int = Field(
|
|
29
|
+
description="Size of text chunks for indexing (default: 1000)",
|
|
30
|
+
default=DEFAULT_CHUNK_SIZE,
|
|
31
|
+
ge=100,
|
|
32
|
+
le=4000,
|
|
33
|
+
)
|
|
34
|
+
chunk_overlap: int = Field(
|
|
35
|
+
description="Overlap between chunks (default: 200)",
|
|
36
|
+
default=DEFAULT_CHUNK_OVERLAP,
|
|
37
|
+
ge=0,
|
|
38
|
+
le=1000,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class QueryIndexInput(BaseModel):
|
|
43
|
+
"""Input for QueryIndex tool."""
|
|
44
|
+
|
|
45
|
+
query: str = Field(
|
|
46
|
+
description="Question or query to search in the indexed content",
|
|
47
|
+
min_length=1,
|
|
48
|
+
max_length=500,
|
|
49
|
+
)
|
|
50
|
+
max_results: int = Field(
|
|
51
|
+
description="Maximum number of relevant documents to return (default: 4)",
|
|
52
|
+
default=4,
|
|
53
|
+
ge=1,
|
|
54
|
+
le=10,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class ScrapeAndIndex(WebScraperBaseTool):
|
|
59
|
+
"""Tool for scraping web content and indexing it into a searchable vector store.
|
|
60
|
+
|
|
61
|
+
This tool can scrape multiple URLs, process the content into chunks,
|
|
62
|
+
and store it in a vector database for later retrieval and question answering.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
name: str = "web_scraper_scrape_and_index"
|
|
66
|
+
description: str = (
|
|
67
|
+
"Scrape content from one or more web URLs and index them into a vector store for later querying.\n"
|
|
68
|
+
"Use this tool to collect and index web content that you want to reference later.\n"
|
|
69
|
+
"The indexed content can then be queried using the query_indexed_content tool."
|
|
70
|
+
)
|
|
71
|
+
args_schema: Type[BaseModel] = ScrapeAndIndexInput
|
|
72
|
+
|
|
73
|
+
async def _arun(
|
|
74
|
+
self,
|
|
75
|
+
urls: List[str],
|
|
76
|
+
chunk_size: int = DEFAULT_CHUNK_SIZE,
|
|
77
|
+
chunk_overlap: int = DEFAULT_CHUNK_OVERLAP,
|
|
78
|
+
config: RunnableConfig = None,
|
|
79
|
+
**kwargs,
|
|
80
|
+
) -> str:
|
|
81
|
+
"""Scrape URLs and index content into vector store."""
|
|
82
|
+
try:
|
|
83
|
+
# Get agent context - throw error if not available
|
|
84
|
+
if not config:
|
|
85
|
+
raise ValueError("Configuration is required but not provided")
|
|
86
|
+
|
|
87
|
+
context = self.context_from_config(config)
|
|
88
|
+
if not context or not context.agent or not context.agent.id:
|
|
89
|
+
raise ValueError("Agent ID is required but not found in configuration")
|
|
90
|
+
|
|
91
|
+
agent_id = context.agent.id
|
|
92
|
+
|
|
93
|
+
logger.info(
|
|
94
|
+
f"[{agent_id}] Starting scrape and index operation with {len(urls)} URLs"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Use the utility function to scrape and index URLs
|
|
98
|
+
total_chunks, was_merged, valid_urls = await scrape_and_index_urls(
|
|
99
|
+
urls, agent_id, self.skill_store, chunk_size, chunk_overlap
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
logger.info(
|
|
103
|
+
f"[{agent_id}] Scraping completed: {total_chunks} chunks indexed, merged: {was_merged}"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if not valid_urls:
|
|
107
|
+
logger.error(f"[{agent_id}] No valid URLs provided")
|
|
108
|
+
return "Error: No valid URLs provided. URLs must start with http:// or https://"
|
|
109
|
+
|
|
110
|
+
if total_chunks == 0:
|
|
111
|
+
logger.error(f"[{agent_id}] No content extracted from URLs")
|
|
112
|
+
return "Error: No content could be extracted from the provided URLs."
|
|
113
|
+
|
|
114
|
+
# Get current storage size for response
|
|
115
|
+
vs_manager = VectorStoreManager(self.skill_store)
|
|
116
|
+
current_size = await vs_manager.get_content_size(agent_id)
|
|
117
|
+
size_limit_reached = len(valid_urls) < len(urls)
|
|
118
|
+
|
|
119
|
+
# Update metadata
|
|
120
|
+
metadata_manager = MetadataManager(self.skill_store)
|
|
121
|
+
new_metadata = metadata_manager.create_url_metadata(
|
|
122
|
+
valid_urls, [], "scrape_and_index"
|
|
123
|
+
)
|
|
124
|
+
await metadata_manager.update_metadata(agent_id, new_metadata)
|
|
125
|
+
|
|
126
|
+
logger.info(f"[{agent_id}] Metadata updated successfully")
|
|
127
|
+
|
|
128
|
+
# Format response
|
|
129
|
+
response = ResponseFormatter.format_indexing_response(
|
|
130
|
+
"scraped and indexed",
|
|
131
|
+
valid_urls,
|
|
132
|
+
total_chunks,
|
|
133
|
+
chunk_size,
|
|
134
|
+
chunk_overlap,
|
|
135
|
+
was_merged,
|
|
136
|
+
current_size_bytes=current_size,
|
|
137
|
+
size_limit_reached=size_limit_reached,
|
|
138
|
+
total_requested_urls=len(urls),
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
logger.info(
|
|
142
|
+
f"[{agent_id}] Scrape and index operation completed successfully"
|
|
143
|
+
)
|
|
144
|
+
return response
|
|
145
|
+
|
|
146
|
+
except Exception as e:
|
|
147
|
+
# Extract agent_id for error logging if possible
|
|
148
|
+
agent_id = "UNKNOWN"
|
|
149
|
+
try:
|
|
150
|
+
if config:
|
|
151
|
+
context = self.context_from_config(config)
|
|
152
|
+
if context and context.agent and context.agent.id:
|
|
153
|
+
agent_id = context.agent.id
|
|
154
|
+
except Exception:
|
|
155
|
+
pass
|
|
156
|
+
|
|
157
|
+
logger.error(f"[{agent_id}] Error in ScrapeAndIndex: {e}", exc_info=True)
|
|
158
|
+
raise type(e)(f"[agent:{agent_id}]: {e}") from e
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class QueryIndexedContent(WebScraperBaseTool):
|
|
162
|
+
"""Tool for querying previously indexed web content.
|
|
163
|
+
|
|
164
|
+
This tool searches through content that was previously scraped and indexed
|
|
165
|
+
using the scrape_and_index tool to answer questions or find relevant information.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
name: str = "web_scraper_query_indexed_content"
|
|
169
|
+
description: str = (
|
|
170
|
+
"Query previously indexed web content to find relevant information and answer questions.\n"
|
|
171
|
+
"Use this tool to search through content that was previously scraped and indexed.\n"
|
|
172
|
+
"This tool can help answer questions based on the indexed web content."
|
|
173
|
+
)
|
|
174
|
+
args_schema: Type[BaseModel] = QueryIndexInput
|
|
175
|
+
|
|
176
|
+
async def _arun(
|
|
177
|
+
self,
|
|
178
|
+
query: str,
|
|
179
|
+
max_results: int = 4,
|
|
180
|
+
config: RunnableConfig = None,
|
|
181
|
+
**kwargs,
|
|
182
|
+
) -> str:
|
|
183
|
+
"""Query the indexed content."""
|
|
184
|
+
try:
|
|
185
|
+
# Get agent context - throw error if not available
|
|
186
|
+
if not config:
|
|
187
|
+
raise ValueError("Configuration is required but not provided")
|
|
188
|
+
|
|
189
|
+
context = self.context_from_config(config)
|
|
190
|
+
if not context or not context.agent or not context.agent.id:
|
|
191
|
+
raise ValueError("Agent ID is required but not found in configuration")
|
|
192
|
+
|
|
193
|
+
agent_id = context.agent.id
|
|
194
|
+
|
|
195
|
+
logger.info(f"[{agent_id}] Starting query operation: '{query}'")
|
|
196
|
+
|
|
197
|
+
# Retrieve vector store
|
|
198
|
+
vector_store_key = f"vector_store_{agent_id}"
|
|
199
|
+
|
|
200
|
+
logger.info(f"[{agent_id}] Looking for vector store: {vector_store_key}")
|
|
201
|
+
|
|
202
|
+
stored_data = await self.skill_store.get_agent_skill_data(
|
|
203
|
+
agent_id, "web_scraper", vector_store_key
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
if not stored_data:
|
|
207
|
+
logger.warning(f"[{agent_id}] No vector store found")
|
|
208
|
+
return "No indexed content found. Please use the scrape_and_index tool first to scrape and index some web content before querying."
|
|
209
|
+
|
|
210
|
+
if not stored_data or "faiss_files" not in stored_data:
|
|
211
|
+
logger.warning(f"[{agent_id}] Invalid stored data structure")
|
|
212
|
+
return "No indexed content found. Please use the scrape_and_index tool first to scrape and index some web content before querying."
|
|
213
|
+
|
|
214
|
+
# Create embeddings and decode vector store
|
|
215
|
+
logger.info(f"[{agent_id}] Decoding vector store")
|
|
216
|
+
vs_manager = VectorStoreManager(self.skill_store)
|
|
217
|
+
embeddings = vs_manager.create_embeddings()
|
|
218
|
+
vector_store = vs_manager.decode_vector_store(
|
|
219
|
+
stored_data["faiss_files"], embeddings
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
logger.info(
|
|
223
|
+
f"[{agent_id}] Vector store loaded, index count: {vector_store.index.ntotal}"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# Perform similarity search
|
|
227
|
+
docs = vector_store.similarity_search(query, k=max_results)
|
|
228
|
+
logger.info(f"[{agent_id}] Found {len(docs)} similar documents")
|
|
229
|
+
|
|
230
|
+
if not docs:
|
|
231
|
+
logger.info(f"[{agent_id}] No relevant documents found for query")
|
|
232
|
+
return f"No relevant information found for your query: '{query}'. The indexed content may not contain information related to your search."
|
|
233
|
+
|
|
234
|
+
# Format results
|
|
235
|
+
results = []
|
|
236
|
+
for i, doc in enumerate(docs, 1):
|
|
237
|
+
content = doc.page_content.strip()
|
|
238
|
+
source = doc.metadata.get("source", "Unknown")
|
|
239
|
+
results.append(f"**Source {i}:** {source}\n{content}")
|
|
240
|
+
|
|
241
|
+
response = "\n\n".join(results)
|
|
242
|
+
logger.info(
|
|
243
|
+
f"[{agent_id}] Query completed successfully, returning {len(response)} chars"
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return response
|
|
247
|
+
|
|
248
|
+
except Exception as e:
|
|
249
|
+
# Extract agent_id for error logging if possible
|
|
250
|
+
agent_id = "UNKNOWN"
|
|
251
|
+
try:
|
|
252
|
+
if config:
|
|
253
|
+
context = self.context_from_config(config)
|
|
254
|
+
if context and context.agent and context.agent.id:
|
|
255
|
+
agent_id = context.agent.id
|
|
256
|
+
except Exception:
|
|
257
|
+
pass
|
|
258
|
+
|
|
259
|
+
logger.error(
|
|
260
|
+
f"[{agent_id}] Error in QueryIndexedContent: {e}", exc_info=True
|
|
261
|
+
)
|
|
262
|
+
raise type(e)(f"[agent:{agent_id}]: {e}") from e
|