intentkit 0.8.6.dev2__py3-none-any.whl → 0.8.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of intentkit might be problematic. Click here for more details.
- intentkit/__init__.py +1 -1
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +10 -5
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +3 -2
- intentkit/clients/cdp.py +53 -92
- intentkit/clients/twitter.py +56 -57
- intentkit/clients/web3.py +1 -3
- intentkit/config/config.py +5 -0
- intentkit/core/agent.py +16 -388
- intentkit/core/asset.py +64 -18
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +19 -20
- intentkit/core/engine.py +26 -11
- intentkit/core/node.py +2 -1
- intentkit/core/prompt.py +53 -15
- intentkit/core/scheduler.py +9 -9
- intentkit/core/statistics.py +6 -7
- intentkit/models/agent.py +256 -176
- intentkit/models/agent_data.py +62 -36
- intentkit/models/agent_schema.json +6 -9
- intentkit/models/app_setting.py +6 -6
- intentkit/models/chat.py +28 -24
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +62 -64
- intentkit/models/db.py +8 -7
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +15 -12
- intentkit/models/llm.py +18 -16
- intentkit/models/redis.py +2 -3
- intentkit/models/skill.py +62 -66
- intentkit/models/skills.csv +30 -26
- intentkit/models/user.py +46 -21
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/base.py +175 -52
- intentkit/skills/basename/__init__.py +4 -8
- intentkit/skills/carv/__init__.py +115 -121
- intentkit/skills/carv/base.py +184 -185
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/token_info_and_price.py +5 -5
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/cdp/__init__.py +3 -10
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +1 -17
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/cookiefun/__init__.py +6 -9
- intentkit/skills/cookiefun/base.py +2 -7
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +10 -24
- intentkit/skills/cryptocompare/fetch_news.py +4 -5
- intentkit/skills/cryptocompare/fetch_price.py +6 -7
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
- intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
- intentkit/skills/cryptopanic/__init__.py +7 -10
- intentkit/skills/cryptopanic/base.py +51 -55
- intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
- intentkit/skills/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +8 -19
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_block.py +6 -8
- intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
- intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
- intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
- intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
- intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
- intentkit/skills/defillama/yields/fetch_pools.py +26 -30
- intentkit/skills/dexscreener/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- intentkit/skills/dune_analytics/__init__.py +7 -9
- intentkit/skills/dune_analytics/base.py +48 -52
- intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
- intentkit/skills/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +26 -28
- intentkit/skills/enso/__init__.py +11 -31
- intentkit/skills/enso/base.py +9 -15
- intentkit/skills/enso/best_yield.py +5 -7
- intentkit/skills/enso/networks.py +3 -9
- intentkit/skills/enso/prices.py +2 -4
- intentkit/skills/enso/route.py +6 -12
- intentkit/skills/enso/tokens.py +4 -16
- intentkit/skills/enso/wallet.py +6 -6
- intentkit/skills/erc20/__init__.py +5 -11
- intentkit/skills/erc721/__init__.py +5 -9
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/scrape.py +17 -22
- intentkit/skills/firecrawl/utils.py +50 -42
- intentkit/skills/github/__init__.py +2 -7
- intentkit/skills/github/base.py +1 -7
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/heurist/__init__.py +8 -27
- intentkit/skills/heurist/base.py +4 -9
- intentkit/skills/heurist/image_generation_animagine_xl.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_comics.py +12 -13
- intentkit/skills/heurist/image_generation_arthemy_real.py +12 -13
- intentkit/skills/heurist/image_generation_braindance.py +12 -13
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +12 -13
- intentkit/skills/heurist/image_generation_flux_1_dev.py +12 -13
- intentkit/skills/heurist/image_generation_sdxl.py +12 -13
- intentkit/skills/http/__init__.py +4 -15
- intentkit/skills/http/base.py +1 -7
- intentkit/skills/http/get.py +21 -16
- intentkit/skills/http/post.py +23 -18
- intentkit/skills/http/put.py +23 -18
- intentkit/skills/lifi/__init__.py +5 -10
- intentkit/skills/lifi/base.py +1 -7
- intentkit/skills/lifi/token_execute.py +14 -17
- intentkit/skills/lifi/token_quote.py +7 -9
- intentkit/skills/lifi/utils.py +16 -16
- intentkit/skills/moralis/__init__.py +6 -10
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +5 -10
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/morpho/__init__.py +5 -9
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/onchain.py +23 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +3 -8
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +4 -8
- intentkit/skills/openai/gpt_image_mini_generator.py +91 -0
- intentkit/skills/openai/gpt_image_to_image.py +4 -8
- intentkit/skills/openai/image_to_text.py +3 -7
- intentkit/skills/openai/schema.json +32 -0
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +17 -18
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +31 -31
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +18 -18
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +4 -10
- intentkit/skills/skills.toml +4 -0
- intentkit/skills/slack/__init__.py +5 -17
- intentkit/skills/slack/base.py +3 -9
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +5 -9
- intentkit/skills/system/__init__.py +7 -24
- intentkit/skills/system/add_autonomous_task.py +10 -12
- intentkit/skills/system/delete_autonomous_task.py +2 -2
- intentkit/skills/system/edit_autonomous_task.py +14 -18
- intentkit/skills/system/list_autonomous_tasks.py +3 -5
- intentkit/skills/system/read_agent_api_key.py +6 -4
- intentkit/skills/system/regenerate_agent_api_key.py +6 -4
- intentkit/skills/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- intentkit/skills/tavily/tavily_extract.py +2 -4
- intentkit/skills/tavily/tavily_search.py +4 -6
- intentkit/skills/token/__init__.py +5 -10
- intentkit/skills/token/base.py +7 -11
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/__init__.py +11 -35
- intentkit/skills/twitter/base.py +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/search_tweets.py +4 -12
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +98 -106
- intentkit/skills/venice_audio/base.py +117 -121
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/venice_audio.py +7 -11
- intentkit/skills/venice_image/__init__.py +147 -154
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +185 -192
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +9 -9
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/__init__.py +5 -18
- intentkit/skills/web_scraper/base.py +21 -7
- intentkit/skills/web_scraper/document_indexer.py +7 -6
- intentkit/skills/web_scraper/scrape_and_index.py +15 -15
- intentkit/skills/web_scraper/utils.py +62 -63
- intentkit/skills/web_scraper/website_indexer.py +17 -19
- intentkit/skills/weth/__init__.py +5 -11
- intentkit/skills/wow/__init__.py +5 -11
- intentkit/skills/x402/__init__.py +61 -0
- intentkit/skills/x402/ask_agent.py +98 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +45 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +6 -6
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/error.py +2 -2
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +8 -9
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +3 -4
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/models/generator.py +0 -347
- intentkit-0.8.6.dev2.dist-info/RECORD +0 -457
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {intentkit-0.8.6.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
intentkit/skills/enso/base.py
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
from decimal import Decimal
|
|
2
|
-
from typing import Optional, Type
|
|
3
2
|
|
|
4
3
|
from coinbase_agentkit import CdpEvmWalletProvider
|
|
5
|
-
from
|
|
4
|
+
from langchain_core.tools.base import ToolException
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
8
7
|
from intentkit.abstracts.graph import AgentContext
|
|
9
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
10
8
|
from intentkit.clients import get_wallet_provider as get_agent_wallet_provider
|
|
9
|
+
from intentkit.config.config import config
|
|
11
10
|
from intentkit.skills.base import IntentKitSkill
|
|
12
11
|
from intentkit.utils.chain import ChainProvider, Network, network_to_id
|
|
13
12
|
|
|
@@ -19,10 +18,7 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
19
18
|
|
|
20
19
|
name: str = Field(description="The name of the tool")
|
|
21
20
|
description: str = Field(description="A description of what the tool does")
|
|
22
|
-
args_schema:
|
|
23
|
-
skill_store: SkillStoreABC = Field(
|
|
24
|
-
description="The skill store for persisting data"
|
|
25
|
-
)
|
|
21
|
+
args_schema: type[BaseModel]
|
|
26
22
|
|
|
27
23
|
async def get_wallet_provider(self, context: AgentContext) -> CdpEvmWalletProvider:
|
|
28
24
|
"""Get the wallet provider from the CDP client.
|
|
@@ -31,7 +27,7 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
31
27
|
context: The skill context containing agent information.
|
|
32
28
|
|
|
33
29
|
Returns:
|
|
34
|
-
|
|
30
|
+
CdpEvmWalletProvider | None: The wallet provider if available.
|
|
35
31
|
"""
|
|
36
32
|
return await get_agent_wallet_provider(context.agent)
|
|
37
33
|
|
|
@@ -39,8 +35,8 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
39
35
|
provider: CdpEvmWalletProvider = await self.get_wallet_provider(context)
|
|
40
36
|
return provider.get_address()
|
|
41
37
|
|
|
42
|
-
def get_chain_provider(self, context: AgentContext) ->
|
|
43
|
-
return
|
|
38
|
+
def get_chain_provider(self, context: AgentContext) -> ChainProvider | None:
|
|
39
|
+
return config.chain_provider
|
|
44
40
|
|
|
45
41
|
def get_main_tokens(self, context: AgentContext) -> list[str]:
|
|
46
42
|
skill_config = context.agent.skill_config(self.category)
|
|
@@ -52,7 +48,7 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
52
48
|
skill_config = context.agent.skill_config(self.category)
|
|
53
49
|
api_key_provider = skill_config.get("api_key_provider")
|
|
54
50
|
if api_key_provider == "platform":
|
|
55
|
-
return
|
|
51
|
+
return config.enso_api_token
|
|
56
52
|
# for backward compatibility, may only have api_token in skill_config
|
|
57
53
|
elif skill_config.get("api_token"):
|
|
58
54
|
return skill_config.get("api_token")
|
|
@@ -62,7 +58,7 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
62
58
|
)
|
|
63
59
|
|
|
64
60
|
def resolve_chain_id(
|
|
65
|
-
self, context: AgentContext, chain_id:
|
|
61
|
+
self, context: AgentContext, chain_id: int | None = None
|
|
66
62
|
) -> int:
|
|
67
63
|
if chain_id:
|
|
68
64
|
return chain_id
|
|
@@ -87,9 +83,7 @@ class EnsoBaseTool(IntentKitSkill):
|
|
|
87
83
|
return "enso"
|
|
88
84
|
|
|
89
85
|
|
|
90
|
-
def format_amount_with_decimals(
|
|
91
|
-
amount: object, decimals: Optional[int]
|
|
92
|
-
) -> Optional[str]:
|
|
86
|
+
def format_amount_with_decimals(amount: object, decimals: int | None) -> str | None:
|
|
93
87
|
if amount is None or decimals is None:
|
|
94
88
|
return None
|
|
95
89
|
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
from typing import List, Optional, Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from intentkit.skills.enso.base import EnsoBaseTool, base_url
|
|
@@ -40,8 +38,8 @@ class YieldOption(BaseModel):
|
|
|
40
38
|
None, description="Primary contract address for interacting with the protocol"
|
|
41
39
|
)
|
|
42
40
|
apy: float = Field(None, description="Annual Percentage Yield")
|
|
43
|
-
tvl:
|
|
44
|
-
underlying_tokens:
|
|
41
|
+
tvl: float | None = Field(None, description="Total Value Locked in the protocol")
|
|
42
|
+
underlying_tokens: list[str] = Field(
|
|
45
43
|
[], description="List of underlying token symbols"
|
|
46
44
|
)
|
|
47
45
|
|
|
@@ -49,7 +47,7 @@ class YieldOption(BaseModel):
|
|
|
49
47
|
class EnsoGetBestYieldOutput(BaseModel):
|
|
50
48
|
"""Output containing the best yield options."""
|
|
51
49
|
|
|
52
|
-
best_options:
|
|
50
|
+
best_options: list[YieldOption] = Field(
|
|
53
51
|
[], description="List of best yield options sorted by APY (descending)"
|
|
54
52
|
)
|
|
55
53
|
token_symbol: str = Field(None, description="Symbol of the token searched for")
|
|
@@ -68,7 +66,7 @@ class EnsoGetBestYield(EnsoBaseTool):
|
|
|
68
66
|
"Find the best yield options for a specific token (default: USDC) across all protocols "
|
|
69
67
|
"on a blockchain network (default: Base). Results are sorted by APY in descending order."
|
|
70
68
|
)
|
|
71
|
-
args_schema:
|
|
69
|
+
args_schema: type[BaseModel] = EnsoGetBestYieldInput
|
|
72
70
|
|
|
73
71
|
async def _arun(
|
|
74
72
|
self,
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Type
|
|
3
2
|
|
|
4
3
|
import httpx
|
|
5
|
-
from
|
|
4
|
+
from langchain_core.tools.base import ToolException
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
8
7
|
from .base import EnsoBaseTool, base_url
|
|
@@ -46,7 +45,7 @@ class EnsoGetNetworks(EnsoBaseTool):
|
|
|
46
45
|
|
|
47
46
|
name: str = "enso_get_networks"
|
|
48
47
|
description: str = "Retrieve networks supported by the Enso API"
|
|
49
|
-
args_schema:
|
|
48
|
+
args_schema: type[BaseModel] = EnsoGetNetworksInput
|
|
50
49
|
|
|
51
50
|
async def _arun(self, **kwargs) -> EnsoGetNetworksOutput:
|
|
52
51
|
"""
|
|
@@ -83,12 +82,7 @@ class EnsoGetNetworks(EnsoBaseTool):
|
|
|
83
82
|
exclude_none=True
|
|
84
83
|
)
|
|
85
84
|
|
|
86
|
-
await self.
|
|
87
|
-
context.agent_id,
|
|
88
|
-
"enso_get_networks",
|
|
89
|
-
"networks",
|
|
90
|
-
networks_memory,
|
|
91
|
-
)
|
|
85
|
+
await self.save_agent_skill_data("networks", networks_memory)
|
|
92
86
|
|
|
93
87
|
return EnsoGetNetworksOutput(res=networks)
|
|
94
88
|
except httpx.RequestError as req_err:
|
intentkit/skills/enso/prices.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from .base import EnsoBaseTool, base_url
|
|
@@ -36,7 +34,7 @@ class EnsoGetPrices(EnsoBaseTool):
|
|
|
36
34
|
|
|
37
35
|
name: str = "enso_get_prices"
|
|
38
36
|
description: str = "Retrieve the price of a token by chain ID and contract address"
|
|
39
|
-
args_schema:
|
|
37
|
+
args_schema: type[BaseModel] = EnsoGetPricesInput
|
|
40
38
|
|
|
41
39
|
async def _arun(
|
|
42
40
|
self,
|
intentkit/skills/enso/route.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from intentkit.skills.enso.networks import EnsoGetNetworks
|
|
@@ -155,7 +153,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
155
153
|
|
|
156
154
|
name: str = "enso_route_shortcut"
|
|
157
155
|
description: str = "This tool is used specifically for broadcasting a route transaction calldata to the network. It should only be used when the user explicitly requests to broadcast a route transaction with routeId."
|
|
158
|
-
args_schema:
|
|
156
|
+
args_schema: type[BaseModel] = EnsoRouteShortcutInput
|
|
159
157
|
|
|
160
158
|
async def _arun(
|
|
161
159
|
self,
|
|
@@ -181,7 +179,6 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
181
179
|
"""
|
|
182
180
|
|
|
183
181
|
context = self.get_context()
|
|
184
|
-
agent_id = context.agent_id
|
|
185
182
|
resolved_chain_id = self.resolve_chain_id(context, chainId)
|
|
186
183
|
api_token = self.get_api_token(context)
|
|
187
184
|
# Use the wallet provider to send the transaction
|
|
@@ -191,8 +188,8 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
191
188
|
async with httpx.AsyncClient() as client:
|
|
192
189
|
try:
|
|
193
190
|
network_name = None
|
|
194
|
-
networks = await self.
|
|
195
|
-
|
|
191
|
+
networks = await self.get_agent_skill_data_raw(
|
|
192
|
+
"enso_get_networks", "networks"
|
|
196
193
|
)
|
|
197
194
|
|
|
198
195
|
if networks:
|
|
@@ -203,9 +200,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
203
200
|
else None
|
|
204
201
|
)
|
|
205
202
|
if network_name is None:
|
|
206
|
-
networks = await EnsoGetNetworks(
|
|
207
|
-
skill_store=self.skill_store,
|
|
208
|
-
).arun()
|
|
203
|
+
networks = await EnsoGetNetworks().arun()
|
|
209
204
|
|
|
210
205
|
for network in networks.res:
|
|
211
206
|
if network.id == resolved_chain_id:
|
|
@@ -221,8 +216,7 @@ class EnsoRouteShortcut(EnsoBaseTool):
|
|
|
221
216
|
"Authorization": f"Bearer {api_token}",
|
|
222
217
|
}
|
|
223
218
|
|
|
224
|
-
token_decimals = await self.
|
|
225
|
-
agent_id,
|
|
219
|
+
token_decimals = await self.get_agent_skill_data_raw(
|
|
226
220
|
"enso_get_tokens",
|
|
227
221
|
"decimals",
|
|
228
222
|
)
|
intentkit/skills/enso/tokens.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
import httpx
|
|
4
|
-
from
|
|
2
|
+
from langchain_core.tools.base import ToolException
|
|
5
3
|
from pydantic import BaseModel, Field
|
|
6
4
|
|
|
7
5
|
from intentkit.skills.enso.base import EnsoBaseTool, base_url
|
|
@@ -133,7 +131,7 @@ class EnsoGetTokens(EnsoBaseTool):
|
|
|
133
131
|
"Enso Finance Token Information Tool: Retrieves detailed token information from the Enso Finance API, "
|
|
134
132
|
"including APY, symbol, address, protocol slug, token type, and underlying tokens."
|
|
135
133
|
)
|
|
136
|
-
args_schema:
|
|
134
|
+
args_schema: type[BaseModel] = EnsoGetTokensInput
|
|
137
135
|
|
|
138
136
|
async def _arun(
|
|
139
137
|
self,
|
|
@@ -154,7 +152,6 @@ class EnsoGetTokens(EnsoBaseTool):
|
|
|
154
152
|
url = f"{base_url}/api/v1/tokens"
|
|
155
153
|
|
|
156
154
|
context = self.get_context()
|
|
157
|
-
agent_id = context.agent_id
|
|
158
155
|
resolved_chain_id = self.resolve_chain_id(context, chainId)
|
|
159
156
|
api_token = self.get_api_token(context)
|
|
160
157
|
main_tokens = self.get_main_tokens(context)
|
|
@@ -178,11 +175,7 @@ class EnsoGetTokens(EnsoBaseTool):
|
|
|
178
175
|
response.raise_for_status()
|
|
179
176
|
json_dict = response.json()
|
|
180
177
|
|
|
181
|
-
token_decimals = await self.
|
|
182
|
-
agent_id,
|
|
183
|
-
"enso_get_tokens",
|
|
184
|
-
"decimals",
|
|
185
|
-
)
|
|
178
|
+
token_decimals = await self.get_agent_skill_data("decimals")
|
|
186
179
|
if not token_decimals:
|
|
187
180
|
token_decimals = {}
|
|
188
181
|
|
|
@@ -203,12 +196,7 @@ class EnsoGetTokens(EnsoBaseTool):
|
|
|
203
196
|
if u_token.address:
|
|
204
197
|
token_decimals[u_token.address] = u_token.decimals
|
|
205
198
|
|
|
206
|
-
await self.
|
|
207
|
-
agent_id,
|
|
208
|
-
"enso_get_tokens",
|
|
209
|
-
"decimals",
|
|
210
|
-
token_decimals,
|
|
211
|
-
)
|
|
199
|
+
await self.save_agent_skill_data("decimals", token_decimals)
|
|
212
200
|
|
|
213
201
|
return res
|
|
214
202
|
except httpx.RequestError as req_err:
|
intentkit/skills/enso/wallet.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from typing import Literal
|
|
1
|
+
from typing import Literal
|
|
2
2
|
|
|
3
3
|
import httpx
|
|
4
|
-
from
|
|
4
|
+
from langchain_core.tools.base import ToolException
|
|
5
5
|
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
7
7
|
from .base import EnsoBaseTool, base_url
|
|
@@ -35,7 +35,7 @@ class EnsoGetWalletBalances(EnsoBaseTool):
|
|
|
35
35
|
description: str = (
|
|
36
36
|
"Retrieve token balances of a wallet on a specified blockchain network."
|
|
37
37
|
)
|
|
38
|
-
args_schema:
|
|
38
|
+
args_schema: type[BaseModel] = EnsoGetBalancesInput
|
|
39
39
|
|
|
40
40
|
async def _arun(
|
|
41
41
|
self,
|
|
@@ -107,7 +107,7 @@ class EnsoGetWalletApprovals(EnsoBaseTool):
|
|
|
107
107
|
description: str = (
|
|
108
108
|
"Retrieve token spend approvals for a wallet on a specified blockchain network."
|
|
109
109
|
)
|
|
110
|
-
args_schema:
|
|
110
|
+
args_schema: type[BaseModel] = EnsoGetApprovalsInput
|
|
111
111
|
|
|
112
112
|
async def _arun(
|
|
113
113
|
self,
|
|
@@ -192,7 +192,7 @@ class EnsoWalletApprove(EnsoBaseTool):
|
|
|
192
192
|
"network. It should only be used when the user explicitly requests to broadcast an approval transaction "
|
|
193
193
|
"with a specific amount for a certain token."
|
|
194
194
|
)
|
|
195
|
-
args_schema:
|
|
195
|
+
args_schema: type[BaseModel] = EnsoWalletApproveInput
|
|
196
196
|
response_format: str = "content_and_artifact"
|
|
197
197
|
|
|
198
198
|
async def _arun(
|
|
@@ -202,7 +202,7 @@ class EnsoWalletApprove(EnsoBaseTool):
|
|
|
202
202
|
chainId: int | None = None,
|
|
203
203
|
routingStrategy: Literal["ensowallet", "router", "delegate"] | None = None,
|
|
204
204
|
**_: object,
|
|
205
|
-
) ->
|
|
205
|
+
) -> tuple[EnsoWalletApproveOutput, EnsoWalletApproveArtifact]:
|
|
206
206
|
context = self.get_context()
|
|
207
207
|
resolved_chain_id = self.resolve_chain_id(context, chainId)
|
|
208
208
|
api_token = self.get_api_token(context)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""ERC20 AgentKit skills."""
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import TypedDict
|
|
4
4
|
|
|
5
5
|
from coinbase_agentkit import erc20_action_provider
|
|
6
6
|
|
|
7
|
-
from intentkit.
|
|
7
|
+
from intentkit.models.agent import Agent
|
|
8
8
|
from intentkit.skills.base import (
|
|
9
9
|
SkillConfig,
|
|
10
10
|
SkillState,
|
|
@@ -13,9 +13,6 @@ from intentkit.skills.base import (
|
|
|
13
13
|
)
|
|
14
14
|
from intentkit.skills.erc20.base import ERC20BaseTool
|
|
15
15
|
|
|
16
|
-
if TYPE_CHECKING:
|
|
17
|
-
from intentkit.models.agent import Agent
|
|
18
|
-
|
|
19
16
|
|
|
20
17
|
class SkillStates(TypedDict):
|
|
21
18
|
ERC20ActionProvider_get_balance: SkillState
|
|
@@ -29,11 +26,10 @@ class Config(SkillConfig):
|
|
|
29
26
|
|
|
30
27
|
|
|
31
28
|
async def get_skills(
|
|
32
|
-
config:
|
|
29
|
+
config: Config,
|
|
33
30
|
is_private: bool,
|
|
34
|
-
store: SkillStoreABC,
|
|
35
31
|
agent_id: str,
|
|
36
|
-
agent:
|
|
32
|
+
agent: Agent | None = None,
|
|
37
33
|
**_,
|
|
38
34
|
) -> list[ERC20BaseTool]:
|
|
39
35
|
"""Get all ERC20 skills."""
|
|
@@ -45,9 +41,7 @@ async def get_skills(
|
|
|
45
41
|
if state == "public" or (state == "private" and is_private):
|
|
46
42
|
available_skills.append(skill_name)
|
|
47
43
|
|
|
48
|
-
actions = await get_agentkit_actions(
|
|
49
|
-
agent_id, store, [erc20_action_provider], agent=agent
|
|
50
|
-
)
|
|
44
|
+
actions = await get_agentkit_actions(agent_id, [erc20_action_provider], agent=agent)
|
|
51
45
|
tools: list[ERC20BaseTool] = []
|
|
52
46
|
for skill in available_skills:
|
|
53
47
|
for action in actions:
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""ERC721 AgentKit skills."""
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import TypedDict
|
|
4
4
|
|
|
5
5
|
from coinbase_agentkit import erc721_action_provider
|
|
6
6
|
|
|
7
|
-
from intentkit.
|
|
7
|
+
from intentkit.models.agent import Agent
|
|
8
8
|
from intentkit.skills.base import (
|
|
9
9
|
SkillConfig,
|
|
10
10
|
SkillState,
|
|
@@ -13,9 +13,6 @@ from intentkit.skills.base import (
|
|
|
13
13
|
)
|
|
14
14
|
from intentkit.skills.erc721.base import ERC721BaseTool
|
|
15
15
|
|
|
16
|
-
if TYPE_CHECKING:
|
|
17
|
-
from intentkit.models.agent import Agent
|
|
18
|
-
|
|
19
16
|
|
|
20
17
|
class SkillStates(TypedDict):
|
|
21
18
|
Erc721ActionProvider_get_balance: SkillState
|
|
@@ -30,11 +27,10 @@ class Config(SkillConfig):
|
|
|
30
27
|
|
|
31
28
|
|
|
32
29
|
async def get_skills(
|
|
33
|
-
config:
|
|
30
|
+
config: Config,
|
|
34
31
|
is_private: bool,
|
|
35
|
-
store: SkillStoreABC,
|
|
36
32
|
agent_id: str,
|
|
37
|
-
agent:
|
|
33
|
+
agent: Agent | None = None,
|
|
38
34
|
**_,
|
|
39
35
|
) -> list[ERC721BaseTool]:
|
|
40
36
|
"""Get all ERC721 skills."""
|
|
@@ -47,7 +43,7 @@ async def get_skills(
|
|
|
47
43
|
available_skills.append(skill_name)
|
|
48
44
|
|
|
49
45
|
actions = await get_agentkit_actions(
|
|
50
|
-
agent_id,
|
|
46
|
+
agent_id, [erc721_action_provider], agent=agent
|
|
51
47
|
)
|
|
52
48
|
tools: list[ERC721BaseTool] = []
|
|
53
49
|
for skill in available_skills:
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
from typing import TypedDict
|
|
5
5
|
|
|
6
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
7
6
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
8
7
|
from intentkit.skills.firecrawl.base import FirecrawlBaseTool
|
|
9
8
|
from intentkit.skills.firecrawl.clear import FirecrawlClearIndexedContent
|
|
@@ -37,7 +36,6 @@ class Config(SkillConfig):
|
|
|
37
36
|
async def get_skills(
|
|
38
37
|
config: "Config",
|
|
39
38
|
is_private: bool,
|
|
40
|
-
store: SkillStoreABC,
|
|
41
39
|
**_,
|
|
42
40
|
) -> list[FirecrawlBaseTool]:
|
|
43
41
|
"""Get all Firecrawl skills.
|
|
@@ -45,7 +43,6 @@ async def get_skills(
|
|
|
45
43
|
Args:
|
|
46
44
|
config: The configuration for Firecrawl skills.
|
|
47
45
|
is_private: Whether to include private skills.
|
|
48
|
-
store: The skill store for persisting data.
|
|
49
46
|
|
|
50
47
|
Returns:
|
|
51
48
|
A list of Firecrawl skills.
|
|
@@ -60,18 +57,16 @@ async def get_skills(
|
|
|
60
57
|
available_skills.append(skill_name)
|
|
61
58
|
|
|
62
59
|
# Get each skill using the cached getter
|
|
63
|
-
return [get_firecrawl_skill(name
|
|
60
|
+
return [get_firecrawl_skill(name) for name in available_skills]
|
|
64
61
|
|
|
65
62
|
|
|
66
63
|
def get_firecrawl_skill(
|
|
67
64
|
name: str,
|
|
68
|
-
store: SkillStoreABC,
|
|
69
65
|
) -> FirecrawlBaseTool:
|
|
70
66
|
"""Get a Firecrawl skill by name.
|
|
71
67
|
|
|
72
68
|
Args:
|
|
73
69
|
name: The name of the skill to get
|
|
74
|
-
store: The skill store for persisting data
|
|
75
70
|
|
|
76
71
|
Returns:
|
|
77
72
|
The requested Firecrawl skill
|
|
@@ -81,27 +76,19 @@ def get_firecrawl_skill(
|
|
|
81
76
|
"""
|
|
82
77
|
if name == "firecrawl_scrape":
|
|
83
78
|
if name not in _cache:
|
|
84
|
-
_cache[name] = FirecrawlScrape(
|
|
85
|
-
skill_store=store,
|
|
86
|
-
)
|
|
79
|
+
_cache[name] = FirecrawlScrape()
|
|
87
80
|
return _cache[name]
|
|
88
81
|
elif name == "firecrawl_crawl":
|
|
89
82
|
if name not in _cache:
|
|
90
|
-
_cache[name] = FirecrawlCrawl(
|
|
91
|
-
skill_store=store,
|
|
92
|
-
)
|
|
83
|
+
_cache[name] = FirecrawlCrawl()
|
|
93
84
|
return _cache[name]
|
|
94
85
|
elif name == "firecrawl_query_indexed_content":
|
|
95
86
|
if name not in _cache:
|
|
96
|
-
_cache[name] = FirecrawlQueryIndexedContent(
|
|
97
|
-
skill_store=store,
|
|
98
|
-
)
|
|
87
|
+
_cache[name] = FirecrawlQueryIndexedContent()
|
|
99
88
|
return _cache[name]
|
|
100
89
|
elif name == "firecrawl_clear_indexed_content":
|
|
101
90
|
if name not in _cache:
|
|
102
|
-
_cache[name] = FirecrawlClearIndexedContent(
|
|
103
|
-
skill_store=store,
|
|
104
|
-
)
|
|
91
|
+
_cache[name] = FirecrawlClearIndexedContent()
|
|
105
92
|
return _cache[name]
|
|
106
93
|
else:
|
|
107
94
|
raise ValueError(f"Unknown Firecrawl skill: {name}")
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from langchain.tools.base import ToolException
|
|
1
|
+
from langchain_core.tools.base import ToolException
|
|
4
2
|
from pydantic import BaseModel, Field
|
|
5
3
|
|
|
6
|
-
from intentkit.
|
|
4
|
+
from intentkit.config.config import config
|
|
7
5
|
from intentkit.skills.base import IntentKitSkill
|
|
8
6
|
|
|
9
7
|
|
|
@@ -12,10 +10,7 @@ class FirecrawlBaseTool(IntentKitSkill):
|
|
|
12
10
|
|
|
13
11
|
name: str = Field(description="The name of the tool")
|
|
14
12
|
description: str = Field(description="A description of what the tool does")
|
|
15
|
-
args_schema:
|
|
16
|
-
skill_store: SkillStoreABC = Field(
|
|
17
|
-
description="The skill store for persisting data"
|
|
18
|
-
)
|
|
13
|
+
args_schema: type[BaseModel]
|
|
19
14
|
|
|
20
15
|
def get_api_key(self) -> str:
|
|
21
16
|
"""Get the Firecrawl API key from configuration."""
|
|
@@ -29,7 +24,7 @@ class FirecrawlBaseTool(IntentKitSkill):
|
|
|
29
24
|
else:
|
|
30
25
|
raise ToolException("No api_key found in agent_owner configuration")
|
|
31
26
|
else:
|
|
32
|
-
return
|
|
27
|
+
return config.firecrawl_api_key
|
|
33
28
|
|
|
34
29
|
@property
|
|
35
30
|
def category(self) -> str:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Type
|
|
3
2
|
|
|
4
3
|
from pydantic import BaseModel, Field
|
|
5
4
|
|
|
5
|
+
from intentkit.models.skill import AgentSkillData
|
|
6
6
|
from intentkit.skills.firecrawl.base import FirecrawlBaseTool
|
|
7
7
|
|
|
8
8
|
logger = logging.getLogger(__name__)
|
|
@@ -30,7 +30,7 @@ class FirecrawlClearIndexedContent(FirecrawlBaseTool):
|
|
|
30
30
|
"This will permanently delete all indexed content and cannot be undone.\n"
|
|
31
31
|
"Use this tool when you want to start fresh with new content."
|
|
32
32
|
)
|
|
33
|
-
args_schema:
|
|
33
|
+
args_schema: type[BaseModel] = FirecrawlClearInput
|
|
34
34
|
|
|
35
35
|
async def _arun(
|
|
36
36
|
self,
|
|
@@ -62,15 +62,11 @@ class FirecrawlClearIndexedContent(FirecrawlBaseTool):
|
|
|
62
62
|
try:
|
|
63
63
|
# Delete vector store data (using web_scraper storage format for compatibility)
|
|
64
64
|
vector_store_key = f"vector_store_{agent_id}"
|
|
65
|
-
await
|
|
66
|
-
agent_id, "web_scraper", vector_store_key
|
|
67
|
-
)
|
|
65
|
+
await AgentSkillData.delete(agent_id, "web_scraper", vector_store_key)
|
|
68
66
|
|
|
69
67
|
# Delete metadata
|
|
70
68
|
metadata_key = f"indexed_urls_{agent_id}"
|
|
71
|
-
await
|
|
72
|
-
agent_id, "web_scraper", metadata_key
|
|
73
|
-
)
|
|
69
|
+
await AgentSkillData.delete(agent_id, "web_scraper", metadata_key)
|
|
74
70
|
|
|
75
71
|
logger.info(
|
|
76
72
|
f"firecrawl_clear: Successfully cleared all indexed content for agent {agent_id}"
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
|
-
from typing import List, Optional, Type
|
|
4
3
|
|
|
5
4
|
import httpx
|
|
6
5
|
from langchain_core.documents import Document
|
|
@@ -20,19 +19,19 @@ class FirecrawlCrawlInput(BaseModel):
|
|
|
20
19
|
limit: int = Field(
|
|
21
20
|
description="Maximum number of pages to crawl", default=10, ge=1, le=1000
|
|
22
21
|
)
|
|
23
|
-
formats:
|
|
22
|
+
formats: list[str] = Field(
|
|
24
23
|
description="Output formats to include in the response. Options: 'markdown', 'html', 'rawHtml', 'screenshot', 'links', 'json'",
|
|
25
24
|
default=["markdown"],
|
|
26
25
|
)
|
|
27
|
-
include_paths:
|
|
26
|
+
include_paths: list[str] | None = Field(
|
|
28
27
|
description="Regex patterns to include in the crawl (e.g., ['^/blog/.*$'])",
|
|
29
28
|
default=None,
|
|
30
29
|
)
|
|
31
|
-
exclude_paths:
|
|
30
|
+
exclude_paths: list[str] | None = Field(
|
|
32
31
|
description="Regex patterns to exclude from the crawl (e.g., ['^/admin/.*$'])",
|
|
33
32
|
default=None,
|
|
34
33
|
)
|
|
35
|
-
max_depth:
|
|
34
|
+
max_depth: int | None = Field(
|
|
36
35
|
description="Maximum depth to crawl from the base URL",
|
|
37
36
|
default=None,
|
|
38
37
|
ge=1,
|
|
@@ -91,16 +90,16 @@ class FirecrawlCrawl(FirecrawlBaseTool):
|
|
|
91
90
|
"Optionally indexes all crawled content for later querying using the firecrawl_query_indexed_content tool. "
|
|
92
91
|
"Use this when you need to gather comprehensive information from a website."
|
|
93
92
|
)
|
|
94
|
-
args_schema:
|
|
93
|
+
args_schema: type[BaseModel] = FirecrawlCrawlInput
|
|
95
94
|
|
|
96
95
|
async def _arun(
|
|
97
96
|
self,
|
|
98
97
|
url: str,
|
|
99
98
|
limit: int = 10,
|
|
100
|
-
formats:
|
|
101
|
-
include_paths:
|
|
102
|
-
exclude_paths:
|
|
103
|
-
max_depth:
|
|
99
|
+
formats: list[str] = None,
|
|
100
|
+
include_paths: list[str] | None = None,
|
|
101
|
+
exclude_paths: list[str] | None = None,
|
|
102
|
+
max_depth: int | None = None,
|
|
104
103
|
allow_backward_links: bool = False,
|
|
105
104
|
allow_external_links: bool = False,
|
|
106
105
|
allow_subdomains: bool = False,
|
|
@@ -137,9 +136,8 @@ class FirecrawlCrawl(FirecrawlBaseTool):
|
|
|
137
136
|
"rate_limit_minutes"
|
|
138
137
|
):
|
|
139
138
|
await self.user_rate_limit_by_category(
|
|
140
|
-
context.user_id,
|
|
141
139
|
skill_config["rate_limit_number"],
|
|
142
|
-
skill_config["rate_limit_minutes"],
|
|
140
|
+
skill_config["rate_limit_minutes"] * 60,
|
|
143
141
|
)
|
|
144
142
|
|
|
145
143
|
# Get the API key from the agent's configuration
|
|
@@ -279,6 +277,7 @@ class FirecrawlCrawl(FirecrawlBaseTool):
|
|
|
279
277
|
# Import indexing utilities from firecrawl utils
|
|
280
278
|
from intentkit.skills.firecrawl.utils import (
|
|
281
279
|
FirecrawlMetadataManager,
|
|
280
|
+
FirecrawlVectorStoreManager,
|
|
282
281
|
index_documents,
|
|
283
282
|
)
|
|
284
283
|
|
|
@@ -309,24 +308,25 @@ class FirecrawlCrawl(FirecrawlBaseTool):
|
|
|
309
308
|
# Get agent ID for indexing
|
|
310
309
|
agent_id = context.agent_id
|
|
311
310
|
if agent_id and documents:
|
|
311
|
+
vector_manager = FirecrawlVectorStoreManager()
|
|
312
|
+
|
|
312
313
|
# Index all documents
|
|
313
314
|
total_chunks, was_merged = await index_documents(
|
|
314
315
|
documents,
|
|
315
316
|
agent_id,
|
|
316
|
-
|
|
317
|
+
vector_manager,
|
|
317
318
|
chunk_size,
|
|
318
319
|
chunk_overlap,
|
|
319
320
|
)
|
|
320
321
|
|
|
321
322
|
# Update metadata
|
|
322
|
-
metadata_manager = FirecrawlMetadataManager(
|
|
323
|
-
self.skill_store
|
|
324
|
-
)
|
|
325
323
|
urls = [doc.metadata["source"] for doc in documents]
|
|
326
|
-
new_metadata =
|
|
327
|
-
|
|
324
|
+
new_metadata = (
|
|
325
|
+
FirecrawlMetadataManager.create_url_metadata(
|
|
326
|
+
urls, documents, "firecrawl_crawl"
|
|
327
|
+
)
|
|
328
328
|
)
|
|
329
|
-
await
|
|
329
|
+
await FirecrawlMetadataManager.update_metadata(
|
|
330
330
|
agent_id, new_metadata
|
|
331
331
|
)
|
|
332
332
|
|