intentkit 0.6.19.dev2__tar.gz → 0.6.20__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.19.dev2 → intentkit-0.6.20}/PKG-INFO +1 -1
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/__init__.py +1 -1
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/pyproject.toml +1 -1
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/base.py +25 -33
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/base.py +3 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/README.md +11 -5
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/schema.json +1 -1
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/scrape.py +145 -30
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/base.py +8 -6
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/delete_data.py +1 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/fetch_data.py +1 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/insert_data.py +1 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/invoke_function.py +1 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/update_data.py +1 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/upsert_data.py +1 -2
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/transfer.py +60 -6
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/.gitignore +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/LICENSE +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/MANIFEST.in +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/agent.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/api.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/engine.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/graph.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/skill.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/abstracts/twitter.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/clients/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/clients/cdp.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/clients/twitter.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/config/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/config/config.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/agent.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/api.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/client.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/credit.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/engine.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/node.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/prompt.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/core/skill.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/agent.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/agent_data.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/agent_schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/app_setting.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/chat.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/conversation.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/credit.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/db.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/db_mig.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/generator.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/llm.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/redis.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/skill.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/models/user.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/acolyt/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/acolyt/acolyt.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/acolyt/ask.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/acolyt/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/acolyt/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/aixbt/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/aixbt/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/aixbt/aixbt.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/aixbt/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/aixbt/projects.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/aixbt/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/allora/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/allora/allora.jpeg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/allora/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/allora/price.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/allora/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/carv.webp +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/fetch_news.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/onchain_query.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/carv/token_info_and_price.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/casino.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/deck_draw.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/deck_shuffle.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/dice_roll.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/casino/utils.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cdp/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cdp/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cdp/cdp.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cdp/get_balance.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cdp/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cdp/swap.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/chainlist/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/chainlist/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/chainlist/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/chainlist/chain_lookup.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/chainlist/chainlist.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/chainlist/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/common/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/common/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/common/common.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/common/current_time.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/common/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/constants.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/cookiefun.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/get_account_details.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/get_account_feed.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/get_account_smart_followers.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/get_sectors.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cookiefun/search_accounts.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/api.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/cryptocompare.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/fetch_news.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/fetch_price.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/fetch_top_exchanges.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/fetch_top_market_cap.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/fetch_top_volume.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/fetch_trading_signals.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptocompare/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptopanic/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptopanic/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptopanic/cryptopanic.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptopanic/fetch_crypto_news.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptopanic/fetch_crypto_sentiment.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/cryptopanic/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dapplooker/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dapplooker/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dapplooker/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dapplooker/dapplooker.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dapplooker/dapplooker_token_data.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dapplooker/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/api.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_batch_historical_prices.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_block.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_current_prices.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_first_price.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_historical_prices.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_price_chart.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/coins/fetch_price_percentage.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/config/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/config/chains.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/defillama.jpeg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/fees/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/fees/fetch_fees_overview.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/stablecoins/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/stablecoins/fetch_stablecoin_chains.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/stablecoins/fetch_stablecoin_charts.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/stablecoins/fetch_stablecoin_prices.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/stablecoins/fetch_stablecoins.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tests/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tests/api_integration.test.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tests/api_unit.test.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/fetch_chain_historical_tvl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/fetch_chains.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/fetch_historical_tvl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/fetch_protocol.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/fetch_protocol_current_tvl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/tvl/fetch_protocols.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/volumes/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/volumes/fetch_dex_overview.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/volumes/fetch_dex_summary.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/volumes/fetch_options_overview.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/yields/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/yields/fetch_pool_chart.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/defillama/yields/fetch_pools.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/dexscreener.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/model/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/model/search_token_response.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dexscreener/search_token.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dune_analytics/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dune_analytics/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dune_analytics/dune.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dune_analytics/fetch_kol_buys.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dune_analytics/fetch_nation_metrics.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/dune_analytics/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/elfa.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/mention.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/stats.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/tokens.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/elfa/utils.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/abi/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/abi/approval.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/abi/erc20.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/abi/route.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/best_yield.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/enso.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/networks.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/prices.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/route.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/tokens.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/enso/wallet.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/clear.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/crawl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/firecrawl.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/query.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/firecrawl/utils.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/github/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/github/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/github/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/github/github.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/github/github_search.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/github/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/heurist.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_animagine_xl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_arthemy_comics.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_arthemy_real.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_braindance.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_cyber_realistic_xl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_flux_1_dev.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/image_generation_sdxl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/heurist/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/get.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/http.svg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/post.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/put.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/http/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/lifi.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/token_execute.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/token_quote.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/lifi/utils.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/api.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/fetch_chain_portfolio.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/fetch_nft_portfolio.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/fetch_solana_portfolio.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/fetch_wallet_portfolio.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/moralis.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/tests/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/moralis/tests/test_wallet.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/nation/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/nation/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/nation/nation.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/nation/nft_check.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/nation/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/dalle_image_generation.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/gpt_image_generation.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/gpt_image_to_image.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/image_to_text.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/openai.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/openai/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/constants.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/moralis.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/token_balances.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_approvals.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_defi_positions.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_history.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_net_worth.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_nfts.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_profitability.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_profitability_summary.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_stats.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/portfolio/wallet_swaps.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/skills.toml +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/get_channel.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/get_message.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/schedule_message.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/send_message.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/slack/slack.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/supabase/supabase.svg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/add_autonomous_task.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/delete_autonomous_task.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/edit_autonomous_task.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/list_autonomous_tasks.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/read_agent_api_key.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/regenerate_agent_api_key.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/system/system.svg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/tavily.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/tavily_extract.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/tavily/tavily_search.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/constants.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/erc20_transfers.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/moralis.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/token_analytics.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/token_price.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/token/token_search.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/follow_user.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/get_mentions.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/get_timeline.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/get_user_by_username.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/get_user_tweets.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/like_tweet.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/post_tweet.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/reply_tweet.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/retweet.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/search_tweets.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/twitter/twitter.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/unrealspeech/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/unrealspeech/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/unrealspeech/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/unrealspeech/text_to_speech.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/unrealspeech/unrealspeech.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_audio/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_audio/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_audio/input.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_audio/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_audio/venice_audio.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_audio/venice_logo.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/api.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/config.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_enhance/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_enhance/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_enhance/image_enhance.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_enhance/image_enhance_base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_enhance/image_enhance_input.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_fluently_xl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_flux_dev.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_input.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_pony_realism.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_generation/image_generation_venice_sd35.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_upscale/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_upscale/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_upscale/image_upscale.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_upscale/image_upscale_base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_upscale/image_upscale_input.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_vision/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_vision/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_vision/image_vision.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_vision/image_vision_base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/image_vision/image_vision_input.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/utils.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/venice_image/venice_image.jpg +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/document_indexer.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/langchain.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/scrape_and_index.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/utils.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/web_scraper/website_indexer.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/README.md +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/base.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/price.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/schema.json +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/swap.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/skills/xmtp/xmtp.png +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/__init__.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/chain.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/error.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/logging.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/random.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/s3.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/slack_alert.py +0 -0
- {intentkit-0.6.19.dev2 → intentkit-0.6.20}/utils/tx.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: intentkit
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.20
|
|
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
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import asyncio
|
|
2
1
|
import logging
|
|
3
2
|
from typing import Any, Callable, Dict, Literal, NotRequired, Optional, TypedDict, Union
|
|
4
3
|
|
|
@@ -6,18 +5,21 @@ from langchain_core.tools import BaseTool
|
|
|
6
5
|
from langchain_core.tools.base import ToolException
|
|
7
6
|
from langgraph.runtime import get_runtime
|
|
8
7
|
from pydantic import (
|
|
9
|
-
BaseModel,
|
|
10
8
|
ValidationError,
|
|
11
9
|
)
|
|
12
10
|
from pydantic.v1 import ValidationError as ValidationErrorV1
|
|
13
11
|
from redis.exceptions import RedisError
|
|
12
|
+
from web3 import Web3
|
|
14
13
|
|
|
15
14
|
from intentkit.abstracts.graph import AgentContext
|
|
16
15
|
from intentkit.abstracts.skill import SkillStoreABC
|
|
17
|
-
from intentkit.models.agent import Agent
|
|
18
16
|
from intentkit.models.redis import get_redis
|
|
17
|
+
from intentkit.utils.chain import ChainProvider
|
|
19
18
|
from intentkit.utils.error import RateLimitExceeded
|
|
20
19
|
|
|
20
|
+
# Global cache for Web3 clients by network_id
|
|
21
|
+
_web3_client_cache: Dict[str, Web3] = {}
|
|
22
|
+
|
|
21
23
|
SkillState = Literal["disabled", "public", "private"]
|
|
22
24
|
SkillOwnerState = Literal["disabled", "private"]
|
|
23
25
|
APIKeyProviderValue = Literal["platform", "agent_owner"]
|
|
@@ -32,36 +34,6 @@ class SkillConfig(TypedDict):
|
|
|
32
34
|
__extra__: NotRequired[Dict[str, Any]]
|
|
33
35
|
|
|
34
36
|
|
|
35
|
-
class SkillContext(BaseModel):
|
|
36
|
-
skill_category: str
|
|
37
|
-
agent_id: str
|
|
38
|
-
user_id: Optional[str] = None
|
|
39
|
-
chat_id: Optional[str] = None
|
|
40
|
-
app_id: Optional[str] = None
|
|
41
|
-
entrypoint: Literal["web", "twitter", "telegram", "trigger", "api"]
|
|
42
|
-
is_private: bool
|
|
43
|
-
payer: Optional[str] = None
|
|
44
|
-
_agent: Optional[Agent] = None
|
|
45
|
-
|
|
46
|
-
@property
|
|
47
|
-
def agent(self) -> Agent:
|
|
48
|
-
if self._agent is None:
|
|
49
|
-
self._agent = asyncio.run(Agent.get(self.agent_id))
|
|
50
|
-
return self._agent
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def config(self) -> Dict[str, Any]:
|
|
54
|
-
agent = self.agent
|
|
55
|
-
config = None
|
|
56
|
-
if agent.skills:
|
|
57
|
-
config = agent.skills.get(self.skill_category)
|
|
58
|
-
if not config:
|
|
59
|
-
raise ValueError(
|
|
60
|
-
f"Skill {self.skill_category} not found in agent {self.agent_id}"
|
|
61
|
-
)
|
|
62
|
-
return config
|
|
63
|
-
|
|
64
|
-
|
|
65
37
|
class IntentKitSkill(BaseTool):
|
|
66
38
|
"""Abstract base class for IntentKit skills.
|
|
67
39
|
Will have predefined abilities.
|
|
@@ -185,3 +157,23 @@ class IntentKitSkill(BaseTool):
|
|
|
185
157
|
if runtime.context is None or not isinstance(runtime.context, AgentContext):
|
|
186
158
|
raise ValueError("No AgentContext found")
|
|
187
159
|
return runtime.context
|
|
160
|
+
|
|
161
|
+
def web3_client(self) -> Web3:
|
|
162
|
+
"""Get a Web3 client for the skill."""
|
|
163
|
+
context = self.get_context()
|
|
164
|
+
agent = context.agent
|
|
165
|
+
network_id = agent.network_id
|
|
166
|
+
|
|
167
|
+
# Check global cache first
|
|
168
|
+
if network_id in _web3_client_cache:
|
|
169
|
+
return _web3_client_cache[network_id]
|
|
170
|
+
|
|
171
|
+
# Create new Web3 client and cache it
|
|
172
|
+
chain_provider: ChainProvider = self.skill_store.get_system_config(
|
|
173
|
+
"chain_provider"
|
|
174
|
+
)
|
|
175
|
+
chain = chain_provider.get_chain_config(network_id)
|
|
176
|
+
web3_client = Web3(Web3.HTTPProvider(chain.rpc_url))
|
|
177
|
+
_web3_client_cache[network_id] = web3_client
|
|
178
|
+
|
|
179
|
+
return web3_client
|
|
@@ -5,8 +5,9 @@ from typing import Type
|
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel, Field
|
|
7
7
|
|
|
8
|
+
from intentkit.abstracts.graph import AgentContext
|
|
8
9
|
from intentkit.abstracts.skill import SkillStoreABC
|
|
9
|
-
from intentkit.skills.base import IntentKitSkill
|
|
10
|
+
from intentkit.skills.base import IntentKitSkill
|
|
10
11
|
from intentkit.skills.defillama.config.chains import (
|
|
11
12
|
get_chain_from_alias,
|
|
12
13
|
)
|
|
@@ -39,7 +40,7 @@ class DefiLlamaBaseTool(IntentKitSkill):
|
|
|
39
40
|
return "defillama"
|
|
40
41
|
|
|
41
42
|
async def check_rate_limit(
|
|
42
|
-
self, context:
|
|
43
|
+
self, context: AgentContext, max_requests: int = 30, interval: int = 5
|
|
43
44
|
) -> tuple[bool, str | None]:
|
|
44
45
|
"""Check if the rate limit has been exceeded.
|
|
45
46
|
|
|
@@ -5,18 +5,22 @@ The Firecrawl skills provide advanced web scraping and content indexing capabili
|
|
|
5
5
|
## Skills Overview
|
|
6
6
|
|
|
7
7
|
### 1. firecrawl_scrape
|
|
8
|
-
Scrapes a single webpage and
|
|
8
|
+
Scrapes a single webpage and REPLACES any existing indexed content for that URL, preventing duplicates.
|
|
9
9
|
|
|
10
10
|
**Parameters:**
|
|
11
11
|
- `url` (required): The URL to scrape
|
|
12
|
-
- `formats` (optional): Output formats - markdown, html, rawHtml, screenshot, links,
|
|
12
|
+
- `formats` (optional): Output formats - markdown, html, rawHtml, screenshot, links, json (default: ["markdown"])
|
|
13
|
+
- `only_main_content` (optional): Extract only main content (default: true)
|
|
13
14
|
- `include_tags` (optional): HTML tags to include (e.g., ["h1", "h2", "p"])
|
|
14
15
|
- `exclude_tags` (optional): HTML tags to exclude
|
|
15
|
-
- `
|
|
16
|
+
- `wait_for` (optional): Wait time in milliseconds before scraping
|
|
17
|
+
- `timeout` (optional): Maximum timeout in milliseconds (default: 30000)
|
|
16
18
|
- `index_content` (optional): Whether to index content for querying (default: true)
|
|
17
19
|
- `chunk_size` (optional): Size of text chunks for indexing (default: 1000)
|
|
18
20
|
- `chunk_overlap` (optional): Overlap between chunks (default: 200)
|
|
19
21
|
|
|
22
|
+
**Use Case:** Use this when you want to refresh/update content from a URL that was previously scraped, ensuring no duplicate or stale content remains.
|
|
23
|
+
|
|
20
24
|
### 2. firecrawl_crawl
|
|
21
25
|
Crawls multiple pages from a website and indexes all content.
|
|
22
26
|
|
|
@@ -158,8 +162,9 @@ Prompt: "Use firecrawl_scrape to scrape https://example.com and index the conten
|
|
|
158
162
|
### Documentation Indexing
|
|
159
163
|
```
|
|
160
164
|
1. Scrape main documentation page
|
|
161
|
-
2. Crawl related documentation sections
|
|
162
|
-
3.
|
|
165
|
+
2. Crawl related documentation sections
|
|
166
|
+
3. Use scrape again to update changed pages (replaces old content)
|
|
167
|
+
4. Query for specific technical information
|
|
163
168
|
```
|
|
164
169
|
|
|
165
170
|
### Competitive Analysis
|
|
@@ -205,6 +210,7 @@ Prompt: "Use firecrawl_scrape to scrape https://example.com and index the conten
|
|
|
205
210
|
- **PDF Support**: Can scrape and index PDF documents
|
|
206
211
|
- **Intelligent Chunking**: Optimized text splitting for better search
|
|
207
212
|
- **Independent Storage**: Uses its own dedicated vector store for Firecrawl content
|
|
213
|
+
- **Content Replacement**: Replace mode prevents duplicate/stale content
|
|
208
214
|
- **Metadata Rich**: Includes source URLs, timestamps, and content types
|
|
209
215
|
- **Semantic Search**: Uses OpenAI embeddings for intelligent querying
|
|
210
216
|
- **Batch Processing**: Efficient handling of multiple pages
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"Agent Owner + All Users",
|
|
35
35
|
"Agent Owner Only"
|
|
36
36
|
],
|
|
37
|
-
"description": "Scrape single web pages and
|
|
37
|
+
"description": "Scrape single web pages and REPLACE any existing indexed content for that URL. Unlike regular scrape, this prevents duplicate content when re-scraping the same page. Use this to refresh/update content from a previously scraped URL.",
|
|
38
38
|
"default": "private"
|
|
39
39
|
},
|
|
40
40
|
"firecrawl_crawl": {
|
|
@@ -62,10 +62,11 @@ class FirecrawlScrapeInput(BaseModel):
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
class FirecrawlScrape(FirecrawlBaseTool):
|
|
65
|
-
"""Tool for scraping web pages using Firecrawl.
|
|
65
|
+
"""Tool for scraping web pages using Firecrawl with REPLACE behavior.
|
|
66
66
|
|
|
67
|
-
This tool uses Firecrawl's API to scrape web pages and
|
|
68
|
-
|
|
67
|
+
This tool uses Firecrawl's API to scrape web pages and REPLACES any existing
|
|
68
|
+
indexed content for the same URL instead of appending to it. This prevents
|
|
69
|
+
duplicate content when re-scraping the same page.
|
|
69
70
|
|
|
70
71
|
Attributes:
|
|
71
72
|
name: The name of the tool.
|
|
@@ -75,10 +76,10 @@ class FirecrawlScrape(FirecrawlBaseTool):
|
|
|
75
76
|
|
|
76
77
|
name: str = "firecrawl_scrape"
|
|
77
78
|
description: str = (
|
|
78
|
-
"Scrape a single web page and
|
|
79
|
+
"Scrape a single web page and REPLACE any existing indexed content for that URL. "
|
|
80
|
+
"Unlike regular scrape, this tool removes old content before adding new content, preventing duplicates. "
|
|
79
81
|
"This tool can handle JavaScript-rendered content, PDFs, and dynamic websites. "
|
|
80
|
-
"
|
|
81
|
-
"Use this when you need to extract clean, structured content from a specific URL."
|
|
82
|
+
"Use this when you want to refresh/update content from a URL that was previously scraped."
|
|
82
83
|
)
|
|
83
84
|
args_schema: Type[BaseModel] = FirecrawlScrapeInput
|
|
84
85
|
|
|
@@ -187,7 +188,7 @@ class FirecrawlScrape(FirecrawlBaseTool):
|
|
|
187
188
|
result_data = data.get("data", {})
|
|
188
189
|
|
|
189
190
|
# Format the results based on requested formats
|
|
190
|
-
formatted_result = f"Successfully scraped: {url}\n\n"
|
|
191
|
+
formatted_result = f"Successfully scraped (REPLACE mode): {url}\n\n"
|
|
191
192
|
|
|
192
193
|
if "markdown" in formats and result_data.get("markdown"):
|
|
193
194
|
formatted_result += "## Markdown Content\n"
|
|
@@ -236,13 +237,16 @@ class FirecrawlScrape(FirecrawlBaseTool):
|
|
|
236
237
|
formatted_result += f"Language: {metadata['language']}\n"
|
|
237
238
|
formatted_result += "\n"
|
|
238
239
|
|
|
239
|
-
# Index content if requested
|
|
240
|
+
# Index content if requested - REPLACE MODE
|
|
240
241
|
if index_content and result_data.get("markdown"):
|
|
241
242
|
try:
|
|
242
|
-
# Import indexing utilities
|
|
243
|
+
# Import indexing utilities
|
|
244
|
+
from langchain_community.vectorstores import FAISS
|
|
245
|
+
|
|
243
246
|
from intentkit.skills.firecrawl.utils import (
|
|
247
|
+
FirecrawlDocumentProcessor,
|
|
244
248
|
FirecrawlMetadataManager,
|
|
245
|
-
|
|
249
|
+
FirecrawlVectorStoreManager,
|
|
246
250
|
)
|
|
247
251
|
|
|
248
252
|
# Create document from scraped content
|
|
@@ -261,38 +265,149 @@ class FirecrawlScrape(FirecrawlBaseTool):
|
|
|
261
265
|
# Get agent ID for indexing
|
|
262
266
|
agent_id = context.agent_id
|
|
263
267
|
if agent_id:
|
|
264
|
-
#
|
|
265
|
-
|
|
266
|
-
[document],
|
|
267
|
-
agent_id,
|
|
268
|
-
self.skill_store,
|
|
269
|
-
chunk_size,
|
|
270
|
-
chunk_overlap,
|
|
271
|
-
)
|
|
272
|
-
|
|
273
|
-
# Update metadata
|
|
268
|
+
# Initialize managers
|
|
269
|
+
vs_manager = FirecrawlVectorStoreManager(self.skill_store)
|
|
274
270
|
metadata_manager = FirecrawlMetadataManager(
|
|
275
271
|
self.skill_store
|
|
276
272
|
)
|
|
277
|
-
|
|
278
|
-
|
|
273
|
+
|
|
274
|
+
# Load existing vector store
|
|
275
|
+
existing_vector_store = await vs_manager.load_vector_store(
|
|
276
|
+
agent_id
|
|
279
277
|
)
|
|
280
|
-
|
|
281
|
-
|
|
278
|
+
|
|
279
|
+
# Split the new document into chunks
|
|
280
|
+
split_docs = FirecrawlDocumentProcessor.split_documents(
|
|
281
|
+
[document], chunk_size, chunk_overlap
|
|
282
282
|
)
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
284
|
+
# Create embeddings
|
|
285
|
+
embeddings = vs_manager.create_embeddings()
|
|
286
|
+
|
|
287
|
+
if existing_vector_store:
|
|
288
|
+
# Get all existing documents and filter out those from the same URL
|
|
289
|
+
try:
|
|
290
|
+
# Try to access documents directly if available
|
|
291
|
+
if hasattr(
|
|
292
|
+
existing_vector_store, "docstore"
|
|
293
|
+
) and hasattr(
|
|
294
|
+
existing_vector_store.docstore, "_dict"
|
|
295
|
+
):
|
|
296
|
+
# Access FAISS documents directly
|
|
297
|
+
all_docs = list(
|
|
298
|
+
existing_vector_store.docstore._dict.values()
|
|
299
|
+
)
|
|
300
|
+
else:
|
|
301
|
+
# Fallback: use a reasonable k value for similarity search
|
|
302
|
+
# Use a dummy query to retrieve documents
|
|
303
|
+
all_docs = existing_vector_store.similarity_search(
|
|
304
|
+
"dummy", # Use a dummy query instead of empty string
|
|
305
|
+
k=1000, # Use reasonable upper bound
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
# Filter out documents from the same URL
|
|
309
|
+
preserved_docs = [
|
|
310
|
+
doc
|
|
311
|
+
for doc in all_docs
|
|
312
|
+
if doc.metadata.get("source") != url
|
|
313
|
+
]
|
|
314
|
+
|
|
315
|
+
logger.info(
|
|
316
|
+
f"firecrawl_scrape: Preserving {len(preserved_docs)} docs from other URLs, "
|
|
317
|
+
f"replacing content from {url}"
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
# Create new vector store with preserved docs + new docs
|
|
321
|
+
if preserved_docs:
|
|
322
|
+
# Combine preserved and new documents
|
|
323
|
+
all_documents = preserved_docs + split_docs
|
|
324
|
+
new_vector_store = FAISS.from_documents(
|
|
325
|
+
all_documents, embeddings
|
|
326
|
+
)
|
|
327
|
+
formatted_result += "\n## Content Replacement\n"
|
|
328
|
+
formatted_result += f"Replaced existing content for URL: {url}\n"
|
|
329
|
+
num_preserved_urls = len(
|
|
330
|
+
set(
|
|
331
|
+
doc.metadata.get("source", "")
|
|
332
|
+
for doc in preserved_docs
|
|
333
|
+
)
|
|
334
|
+
)
|
|
335
|
+
formatted_result += f"Preserved content from {num_preserved_urls} other URLs\n"
|
|
336
|
+
else:
|
|
337
|
+
# No other documents to preserve, just create from new docs
|
|
338
|
+
new_vector_store = FAISS.from_documents(
|
|
339
|
+
split_docs, embeddings
|
|
340
|
+
)
|
|
341
|
+
formatted_result += "\n## Content Replacement\n"
|
|
342
|
+
formatted_result += f"Created new index with content from: {url}\n"
|
|
343
|
+
except Exception as e:
|
|
344
|
+
logger.warning(
|
|
345
|
+
f"Could not preserve other URLs, creating fresh index: {e}"
|
|
346
|
+
)
|
|
347
|
+
# Fallback: create new store with just the new documents
|
|
348
|
+
new_vector_store = FAISS.from_documents(
|
|
349
|
+
split_docs, embeddings
|
|
350
|
+
)
|
|
351
|
+
formatted_result += "\n## Content Replacement\n"
|
|
352
|
+
formatted_result += f"Created fresh index with content from: {url}\n"
|
|
353
|
+
else:
|
|
354
|
+
# No existing store, create new one
|
|
355
|
+
new_vector_store = FAISS.from_documents(
|
|
356
|
+
split_docs, embeddings
|
|
357
|
+
)
|
|
358
|
+
formatted_result += "\n## Content Indexing\n"
|
|
359
|
+
formatted_result += (
|
|
360
|
+
f"Created new index with content from: {url}\n"
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
# Save the new vector store
|
|
364
|
+
await vs_manager.save_vector_store(
|
|
365
|
+
agent_id, new_vector_store, chunk_size, chunk_overlap
|
|
287
366
|
)
|
|
288
|
-
|
|
367
|
+
|
|
368
|
+
# Update metadata to track all URLs
|
|
369
|
+
# Get existing metadata to preserve other URLs
|
|
370
|
+
metadata_key = f"indexed_urls_{agent_id}"
|
|
371
|
+
existing_metadata = (
|
|
372
|
+
await self.skill_store.get_agent_skill_data(
|
|
373
|
+
agent_id, "firecrawl", metadata_key
|
|
374
|
+
)
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
if existing_metadata and existing_metadata.get("urls"):
|
|
378
|
+
# Remove the current URL and add it back (to update timestamp)
|
|
379
|
+
existing_urls = [
|
|
380
|
+
u for u in existing_metadata["urls"] if u != url
|
|
381
|
+
]
|
|
382
|
+
existing_urls.append(url)
|
|
383
|
+
updated_metadata = {
|
|
384
|
+
"urls": existing_urls,
|
|
385
|
+
"document_count": len(existing_urls),
|
|
386
|
+
"source_type": "firecrawl_mixed",
|
|
387
|
+
"indexed_at": str(len(existing_urls)),
|
|
388
|
+
}
|
|
389
|
+
else:
|
|
390
|
+
# Create new metadata
|
|
391
|
+
updated_metadata = metadata_manager.create_url_metadata(
|
|
392
|
+
[url], [document], "firecrawl_scrape"
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
await metadata_manager.update_metadata(
|
|
396
|
+
agent_id, updated_metadata
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
formatted_result += "\n## Content Indexing (REPLACE MODE)\n"
|
|
400
|
+
formatted_result += "Successfully REPLACED indexed content in vector store:\n"
|
|
401
|
+
formatted_result += f"- Chunks created: {len(split_docs)}\n"
|
|
289
402
|
formatted_result += f"- Chunk size: {chunk_size}\n"
|
|
290
403
|
formatted_result += f"- Chunk overlap: {chunk_overlap}\n"
|
|
291
|
-
formatted_result +=
|
|
404
|
+
formatted_result += (
|
|
405
|
+
"- Previous content for this URL: REPLACED\n"
|
|
406
|
+
)
|
|
292
407
|
formatted_result += "Use the 'firecrawl_query_indexed_content' skill to search this content.\n"
|
|
293
408
|
|
|
294
409
|
logger.info(
|
|
295
|
-
f"firecrawl_scrape: Successfully
|
|
410
|
+
f"firecrawl_scrape: Successfully replaced content for {url} with {len(split_docs)} chunks"
|
|
296
411
|
)
|
|
297
412
|
else:
|
|
298
413
|
formatted_result += "\n## Content Indexing\n"
|
|
@@ -3,8 +3,9 @@ from typing import Type
|
|
|
3
3
|
from langchain_core.tools import ToolException
|
|
4
4
|
from pydantic import BaseModel, Field
|
|
5
5
|
|
|
6
|
+
from intentkit.abstracts.graph import AgentContext
|
|
6
7
|
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
|
-
from intentkit.skills.base import IntentKitSkill
|
|
8
|
+
from intentkit.skills.base import IntentKitSkill
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class SupabaseBaseTool(IntentKitSkill):
|
|
@@ -21,9 +22,7 @@ class SupabaseBaseTool(IntentKitSkill):
|
|
|
21
22
|
def category(self) -> str:
|
|
22
23
|
return "supabase"
|
|
23
24
|
|
|
24
|
-
def get_supabase_config(
|
|
25
|
-
self, config: dict, context: SkillContext
|
|
26
|
-
) -> tuple[str, str]:
|
|
25
|
+
def get_supabase_config(self, context: AgentContext) -> tuple[str, str]:
|
|
27
26
|
"""Get Supabase URL and key from config.
|
|
28
27
|
|
|
29
28
|
Args:
|
|
@@ -36,6 +35,7 @@ class SupabaseBaseTool(IntentKitSkill):
|
|
|
36
35
|
Raises:
|
|
37
36
|
ValueError: If required config is missing
|
|
38
37
|
"""
|
|
38
|
+
config = context.agent.skill_config(self.category)
|
|
39
39
|
supabase_url = config.get("supabase_url")
|
|
40
40
|
|
|
41
41
|
# Use public_key for public operations if available, otherwise fall back to supabase_key
|
|
@@ -52,7 +52,7 @@ class SupabaseBaseTool(IntentKitSkill):
|
|
|
52
52
|
|
|
53
53
|
return supabase_url, supabase_key
|
|
54
54
|
|
|
55
|
-
def validate_table_access(self, table: str, context:
|
|
55
|
+
def validate_table_access(self, table: str, context: AgentContext) -> None:
|
|
56
56
|
"""Validate if the table can be accessed for write operations in public mode.
|
|
57
57
|
|
|
58
58
|
Args:
|
|
@@ -66,8 +66,10 @@ class SupabaseBaseTool(IntentKitSkill):
|
|
|
66
66
|
if context.is_private:
|
|
67
67
|
return
|
|
68
68
|
|
|
69
|
+
config = context.agent.skill_config(self.category)
|
|
70
|
+
|
|
69
71
|
# In public mode, check if table is in allowed list
|
|
70
|
-
public_write_tables =
|
|
72
|
+
public_write_tables = config.get("public_write_tables", "")
|
|
71
73
|
if not public_write_tables:
|
|
72
74
|
return
|
|
73
75
|
|
|
@@ -45,12 +45,11 @@ class SupabaseDeleteData(SupabaseBaseTool):
|
|
|
45
45
|
):
|
|
46
46
|
try:
|
|
47
47
|
context = self.get_context()
|
|
48
|
-
skill_config = context.agent.skill_config(self.category)
|
|
49
48
|
|
|
50
49
|
# Validate table access for public mode
|
|
51
50
|
self.validate_table_access(table, context)
|
|
52
51
|
|
|
53
|
-
supabase_url, supabase_key = self.get_supabase_config(
|
|
52
|
+
supabase_url, supabase_key = self.get_supabase_config(context)
|
|
54
53
|
|
|
55
54
|
# Create Supabase client
|
|
56
55
|
supabase: Client = create_client(supabase_url, supabase_key)
|
|
@@ -60,8 +60,7 @@ class SupabaseFetchData(SupabaseBaseTool):
|
|
|
60
60
|
):
|
|
61
61
|
try:
|
|
62
62
|
context = self.get_context()
|
|
63
|
-
|
|
64
|
-
supabase_url, supabase_key = self.get_supabase_config(skill_config, context)
|
|
63
|
+
supabase_url, supabase_key = self.get_supabase_config(context)
|
|
65
64
|
|
|
66
65
|
# Create Supabase client
|
|
67
66
|
supabase: Client = create_client(supabase_url, supabase_key)
|
|
@@ -45,12 +45,11 @@ class SupabaseInsertData(SupabaseBaseTool):
|
|
|
45
45
|
):
|
|
46
46
|
try:
|
|
47
47
|
context = self.get_context()
|
|
48
|
-
skill_config = context.agent.skill_config(self.category)
|
|
49
48
|
|
|
50
49
|
# Validate table access for public mode
|
|
51
50
|
self.validate_table_access(table, context)
|
|
52
51
|
|
|
53
|
-
supabase_url, supabase_key = self.get_supabase_config(
|
|
52
|
+
supabase_url, supabase_key = self.get_supabase_config(context)
|
|
54
53
|
|
|
55
54
|
# Create Supabase client
|
|
56
55
|
supabase: Client = create_client(supabase_url, supabase_key)
|
|
@@ -44,8 +44,7 @@ class SupabaseInvokeFunction(SupabaseBaseTool):
|
|
|
44
44
|
):
|
|
45
45
|
try:
|
|
46
46
|
context = self.get_context()
|
|
47
|
-
|
|
48
|
-
supabase_url, supabase_key = self.get_supabase_config(skill_config, context)
|
|
47
|
+
supabase_url, supabase_key = self.get_supabase_config(context)
|
|
49
48
|
|
|
50
49
|
# Create Supabase client
|
|
51
50
|
supabase: Client = create_client(supabase_url, supabase_key)
|
|
@@ -48,12 +48,11 @@ class SupabaseUpdateData(SupabaseBaseTool):
|
|
|
48
48
|
):
|
|
49
49
|
try:
|
|
50
50
|
context = self.get_context()
|
|
51
|
-
skill_config = context.agent.skill_config(self.category)
|
|
52
51
|
|
|
53
52
|
# Validate table access for public mode
|
|
54
53
|
self.validate_table_access(table, context)
|
|
55
54
|
|
|
56
|
-
supabase_url, supabase_key = self.get_supabase_config(
|
|
55
|
+
supabase_url, supabase_key = self.get_supabase_config(context)
|
|
57
56
|
|
|
58
57
|
# Create Supabase client
|
|
59
58
|
supabase: Client = create_client(supabase_url, supabase_key)
|
|
@@ -50,12 +50,11 @@ class SupabaseUpsertData(SupabaseBaseTool):
|
|
|
50
50
|
):
|
|
51
51
|
try:
|
|
52
52
|
context = self.get_context()
|
|
53
|
-
skill_config = context.agent.skill_config(self.category)
|
|
54
53
|
|
|
55
54
|
# Validate table access for public mode
|
|
56
55
|
self.validate_table_access(table, context)
|
|
57
56
|
|
|
58
|
-
supabase_url, supabase_key = self.get_supabase_config(
|
|
57
|
+
supabase_url, supabase_key = self.get_supabase_config(context)
|
|
59
58
|
|
|
60
59
|
# Create Supabase client
|
|
61
60
|
supabase: Client = create_client(supabase_url, supabase_key)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from typing import List, Optional, Tuple, Type
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel, Field
|
|
4
|
+
from web3.exceptions import ContractLogicError
|
|
4
5
|
|
|
5
6
|
from intentkit.models.chat import ChatMessageAttachment, ChatMessageAttachmentType
|
|
6
7
|
from intentkit.skills.xmtp.base import XmtpBaseTool
|
|
@@ -14,9 +15,6 @@ class TransferInput(BaseModel):
|
|
|
14
15
|
amount: str = Field(
|
|
15
16
|
description="The amount to transfer (as string to handle large numbers)"
|
|
16
17
|
)
|
|
17
|
-
decimals: int = Field(
|
|
18
|
-
description="Number of decimal places for the token (18 for ETH, varies for ERC20 tokens)"
|
|
19
|
-
)
|
|
20
18
|
currency: str = Field(description="Currency symbol (e.g., 'ETH', 'USDC', 'DAI')")
|
|
21
19
|
token_contract_address: Optional[str] = Field(
|
|
22
20
|
default=None,
|
|
@@ -44,7 +42,6 @@ class XmtpTransfer(XmtpBaseTool):
|
|
|
44
42
|
from_address: str,
|
|
45
43
|
to_address: str,
|
|
46
44
|
amount: str,
|
|
47
|
-
decimals: int,
|
|
48
45
|
currency: str,
|
|
49
46
|
token_contract_address: Optional[str],
|
|
50
47
|
) -> Tuple[str, List[ChatMessageAttachment]]:
|
|
@@ -54,10 +51,8 @@ class XmtpTransfer(XmtpBaseTool):
|
|
|
54
51
|
from_address: The sender address
|
|
55
52
|
to_address: The recipient address
|
|
56
53
|
amount: Amount to transfer
|
|
57
|
-
decimals: Token decimals
|
|
58
54
|
currency: Currency symbol
|
|
59
55
|
token_contract_address: Token contract address (None for ETH)
|
|
60
|
-
config: LangChain runnable config
|
|
61
56
|
|
|
62
57
|
Returns:
|
|
63
58
|
Tuple of (content_message, list_of_attachments)
|
|
@@ -80,6 +75,65 @@ class XmtpTransfer(XmtpBaseTool):
|
|
|
80
75
|
|
|
81
76
|
chain_id_hex = chain_id_hex_by_network[agent.network_id]
|
|
82
77
|
|
|
78
|
+
# Validate token contract and get decimals
|
|
79
|
+
if token_contract_address:
|
|
80
|
+
# Validate ERC20 contract and get token info
|
|
81
|
+
web3 = self.web3_client()
|
|
82
|
+
|
|
83
|
+
# ERC20 ABI for symbol() and decimals() functions
|
|
84
|
+
erc20_abi = [
|
|
85
|
+
{
|
|
86
|
+
"constant": True,
|
|
87
|
+
"inputs": [],
|
|
88
|
+
"name": "symbol",
|
|
89
|
+
"outputs": [{"name": "", "type": "string"}],
|
|
90
|
+
"type": "function",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"constant": True,
|
|
94
|
+
"inputs": [],
|
|
95
|
+
"name": "decimals",
|
|
96
|
+
"outputs": [{"name": "", "type": "uint8"}],
|
|
97
|
+
"type": "function",
|
|
98
|
+
},
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
# Create contract instance
|
|
103
|
+
contract = web3.eth.contract(
|
|
104
|
+
address=web3.to_checksum_address(token_contract_address),
|
|
105
|
+
abi=erc20_abi,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Get token symbol and decimals
|
|
109
|
+
token_symbol = contract.functions.symbol().call()
|
|
110
|
+
decimals = contract.functions.decimals().call()
|
|
111
|
+
|
|
112
|
+
# Validate symbol matches currency (case insensitive)
|
|
113
|
+
if token_symbol.upper() != currency.upper():
|
|
114
|
+
raise ValueError(
|
|
115
|
+
f"Token symbol mismatch: contract symbol is '{token_symbol}', "
|
|
116
|
+
f"but currency parameter is '{currency}'"
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
except ContractLogicError:
|
|
120
|
+
raise ValueError(
|
|
121
|
+
f"Invalid ERC20 contract address: {token_contract_address}. "
|
|
122
|
+
"The address does not point to a valid ERC20 token contract."
|
|
123
|
+
)
|
|
124
|
+
except Exception as e:
|
|
125
|
+
raise ValueError(
|
|
126
|
+
f"Failed to validate ERC20 contract {token_contract_address}: {str(e)}"
|
|
127
|
+
)
|
|
128
|
+
else:
|
|
129
|
+
# For ETH transfers, use 18 decimals
|
|
130
|
+
decimals = 18
|
|
131
|
+
# Validate currency is ETH for native transfers
|
|
132
|
+
if currency.upper() != "ETH":
|
|
133
|
+
raise ValueError(
|
|
134
|
+
f"For native transfers, currency must be 'ETH', got '{currency}'"
|
|
135
|
+
)
|
|
136
|
+
|
|
83
137
|
# Calculate amount in smallest unit (wei for ETH, token units for ERC20)
|
|
84
138
|
amount_int = int(float(amount) * (10**decimals))
|
|
85
139
|
|
|
File without changes
|