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/moralis/base.py
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
"""Base class for Wallet Portfolio tools."""
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
from langchain.tools.base import ToolException
|
|
3
|
+
from langchain_core.tools.base import ToolException
|
|
6
4
|
from pydantic import BaseModel, Field
|
|
7
5
|
|
|
8
|
-
from intentkit.
|
|
6
|
+
from intentkit.config.config import config
|
|
9
7
|
from intentkit.skills.base import IntentKitSkill
|
|
10
8
|
|
|
11
9
|
# Chain ID to chain name mapping for EVM chains
|
|
@@ -29,13 +27,10 @@ class WalletBaseTool(IntentKitSkill):
|
|
|
29
27
|
|
|
30
28
|
name: str = Field(description="The name of the tool")
|
|
31
29
|
description: str = Field(description="A description of what the tool does")
|
|
32
|
-
args_schema:
|
|
33
|
-
skill_store: SkillStoreABC = Field(
|
|
34
|
-
description="The skill store for persisting data"
|
|
35
|
-
)
|
|
30
|
+
args_schema: type[BaseModel]
|
|
36
31
|
|
|
37
32
|
# Optional fields for blockchain providers
|
|
38
|
-
solana_networks:
|
|
33
|
+
solana_networks: list[str] | None = Field(
|
|
39
34
|
default=SOLANA_NETWORKS, description="Supported Solana networks"
|
|
40
35
|
)
|
|
41
36
|
|
|
@@ -44,7 +39,7 @@ class WalletBaseTool(IntentKitSkill):
|
|
|
44
39
|
skill_config = context.agent.skill_config(self.category)
|
|
45
40
|
api_key_provider = skill_config.get("api_key_provider")
|
|
46
41
|
if api_key_provider == "platform":
|
|
47
|
-
return
|
|
42
|
+
return config.moralis_api_key
|
|
48
43
|
# for backward compatibility, may only have api_key in skill_config
|
|
49
44
|
elif skill_config.get("api_key"):
|
|
50
45
|
return skill_config.get("api_key")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""fetching wallet portfolio for a specific blockchain."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import List, Optional, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -27,7 +26,7 @@ class ChainTokenBalance(BaseModel):
|
|
|
27
26
|
contract_address: str = Field(..., description="Token contract address")
|
|
28
27
|
symbol: str = Field(..., description="Token symbol")
|
|
29
28
|
name: str = Field(..., description="Token name")
|
|
30
|
-
logo:
|
|
29
|
+
logo: str | None = Field(None, description="Token logo URL")
|
|
31
30
|
decimals: int = Field(..., description="Token decimals")
|
|
32
31
|
balance: float = Field(..., description="Token balance")
|
|
33
32
|
balance_raw: str = Field(..., description="Raw token balance")
|
|
@@ -38,12 +37,12 @@ class TokenApproval(BaseModel):
|
|
|
38
37
|
"""Model for token approval."""
|
|
39
38
|
|
|
40
39
|
token_address: str = Field(..., description="Token contract address")
|
|
41
|
-
token_symbol:
|
|
42
|
-
token_name:
|
|
40
|
+
token_symbol: str | None = Field(None, description="Token symbol")
|
|
41
|
+
token_name: str | None = Field(None, description="Token name")
|
|
43
42
|
spender: str = Field(..., description="Spender address (contract)")
|
|
44
|
-
spender_name:
|
|
43
|
+
spender_name: str | None = Field(None, description="Spender name if known")
|
|
45
44
|
allowance: str = Field(..., description="Raw approval amount")
|
|
46
|
-
allowance_formatted:
|
|
45
|
+
allowance_formatted: float | None = Field(
|
|
47
46
|
None, description="Formatted approval amount"
|
|
48
47
|
)
|
|
49
48
|
unlimited: bool = Field(False, description="Whether the approval is unlimited")
|
|
@@ -55,17 +54,17 @@ class ChainPortfolioOutput(BaseModel):
|
|
|
55
54
|
address: str = Field(..., description="Wallet address")
|
|
56
55
|
chain_id: int = Field(..., description="Chain ID")
|
|
57
56
|
chain_name: str = Field(..., description="Chain name")
|
|
58
|
-
native_token:
|
|
57
|
+
native_token: ChainTokenBalance | None = Field(
|
|
59
58
|
None, description="Native token balance"
|
|
60
59
|
)
|
|
61
|
-
tokens:
|
|
60
|
+
tokens: list[ChainTokenBalance] = Field(
|
|
62
61
|
default_factory=list, description="List of token balances"
|
|
63
62
|
)
|
|
64
63
|
total_usd_value: float = Field(0.0, description="Total USD value on this chain")
|
|
65
|
-
approvals:
|
|
64
|
+
approvals: list[TokenApproval] | None = Field(
|
|
66
65
|
None, description="Token approvals if requested"
|
|
67
66
|
)
|
|
68
|
-
error:
|
|
67
|
+
error: str | None = Field(None, description="Error message if any")
|
|
69
68
|
|
|
70
69
|
|
|
71
70
|
class FetchChainPortfolio(WalletBaseTool):
|
|
@@ -87,7 +86,7 @@ class FetchChainPortfolio(WalletBaseTool):
|
|
|
87
86
|
"- Token approvals (optional)\n"
|
|
88
87
|
"Use this tool whenever a user wants to see their holdings on a specific blockchain."
|
|
89
88
|
)
|
|
90
|
-
args_schema:
|
|
89
|
+
args_schema: type[BaseModel] = FetchChainPortfolioInput
|
|
91
90
|
|
|
92
91
|
async def _arun(
|
|
93
92
|
self, address: str, chain_id: int, include_approvals: bool = False, **kwargs
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
@@ -16,7 +16,7 @@ class FetchNftPortfolioInput(BaseModel):
|
|
|
16
16
|
"""Input for FetchNftPortfolio tool."""
|
|
17
17
|
|
|
18
18
|
address: str = Field(..., description="Wallet address")
|
|
19
|
-
chain_id:
|
|
19
|
+
chain_id: int | None = Field(
|
|
20
20
|
None,
|
|
21
21
|
description="Chain ID (if not specified, fetches from all supported chains)",
|
|
22
22
|
)
|
|
@@ -26,7 +26,7 @@ class FetchNftPortfolioInput(BaseModel):
|
|
|
26
26
|
solana_network: str = Field(
|
|
27
27
|
default="mainnet", description="Solana network to use (mainnet or devnet)"
|
|
28
28
|
)
|
|
29
|
-
limit:
|
|
29
|
+
limit: int | None = Field(100, description="Maximum number of NFTs to return")
|
|
30
30
|
normalize_metadata: bool = Field(
|
|
31
31
|
True, description="Whether to normalize metadata across different standards"
|
|
32
32
|
)
|
|
@@ -35,12 +35,12 @@ class FetchNftPortfolioInput(BaseModel):
|
|
|
35
35
|
class NftMetadata(BaseModel):
|
|
36
36
|
"""Model for NFT metadata."""
|
|
37
37
|
|
|
38
|
-
name:
|
|
39
|
-
description:
|
|
40
|
-
image:
|
|
41
|
-
animation_url:
|
|
42
|
-
attributes:
|
|
43
|
-
external_url:
|
|
38
|
+
name: str | None = Field(None, description="NFT name")
|
|
39
|
+
description: str | None = Field(None, description="NFT description")
|
|
40
|
+
image: str | None = Field(None, description="NFT image URL")
|
|
41
|
+
animation_url: str | None = Field(None, description="NFT animation URL")
|
|
42
|
+
attributes: list[dict] | None = Field(None, description="NFT attributes/traits")
|
|
43
|
+
external_url: str | None = Field(None, description="External URL")
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
class NftItem(BaseModel):
|
|
@@ -48,14 +48,14 @@ class NftItem(BaseModel):
|
|
|
48
48
|
|
|
49
49
|
token_id: str = Field(..., description="NFT token ID")
|
|
50
50
|
token_address: str = Field(..., description="NFT contract address")
|
|
51
|
-
contract_type:
|
|
51
|
+
contract_type: str | None = Field(
|
|
52
52
|
None, description="NFT contract type (ERC721, ERC1155, etc.)"
|
|
53
53
|
)
|
|
54
|
-
name:
|
|
55
|
-
symbol:
|
|
54
|
+
name: str | None = Field(None, description="NFT name")
|
|
55
|
+
symbol: str | None = Field(None, description="NFT symbol")
|
|
56
56
|
owner_of: str = Field(..., description="Owner address")
|
|
57
|
-
metadata:
|
|
58
|
-
floor_price:
|
|
57
|
+
metadata: NftMetadata | None = Field(None, description="NFT metadata")
|
|
58
|
+
floor_price: float | None = Field(None, description="Floor price if available")
|
|
59
59
|
chain: str = Field("eth", description="Blockchain network")
|
|
60
60
|
|
|
61
61
|
|
|
@@ -63,13 +63,13 @@ class NftPortfolioOutput(BaseModel):
|
|
|
63
63
|
"""Output for FetchNftPortfolio tool."""
|
|
64
64
|
|
|
65
65
|
address: str = Field(..., description="Wallet address")
|
|
66
|
-
nfts:
|
|
66
|
+
nfts: list[NftItem] = Field(default_factory=list, description="List of NFT items")
|
|
67
67
|
total_count: int = Field(0, description="Total count of NFTs")
|
|
68
|
-
chains:
|
|
68
|
+
chains: list[str] = Field(
|
|
69
69
|
default_factory=list, description="Chains included in the response"
|
|
70
70
|
)
|
|
71
|
-
cursor:
|
|
72
|
-
error:
|
|
71
|
+
cursor: str | None = Field(None, description="Cursor for pagination")
|
|
72
|
+
error: str | None = Field(None, description="Error message if any")
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
class FetchNftPortfolio(WalletBaseTool):
|
|
@@ -90,12 +90,12 @@ class FetchNftPortfolio(WalletBaseTool):
|
|
|
90
90
|
"- Floor prices if available\n"
|
|
91
91
|
"Use this tool whenever a user asks about their NFTs or digital collectibles."
|
|
92
92
|
)
|
|
93
|
-
args_schema:
|
|
93
|
+
args_schema: type[BaseModel] = FetchNftPortfolioInput
|
|
94
94
|
|
|
95
95
|
async def _arun(
|
|
96
96
|
self,
|
|
97
97
|
address: str,
|
|
98
|
-
chain_id:
|
|
98
|
+
chain_id: int | None = None,
|
|
99
99
|
include_solana: bool = False,
|
|
100
100
|
solana_network: str = "mainnet",
|
|
101
101
|
limit: int = 100,
|
|
@@ -156,7 +156,7 @@ class FetchNftPortfolio(WalletBaseTool):
|
|
|
156
156
|
chain_id: int,
|
|
157
157
|
limit: int,
|
|
158
158
|
normalize_metadata: bool,
|
|
159
|
-
result:
|
|
159
|
+
result: dict[str, Any],
|
|
160
160
|
) -> None:
|
|
161
161
|
"""Fetch NFTs from an EVM chain.
|
|
162
162
|
|
|
@@ -222,7 +222,7 @@ class FetchNftPortfolio(WalletBaseTool):
|
|
|
222
222
|
result["nfts"].append(nft_item)
|
|
223
223
|
|
|
224
224
|
async def _fetch_solana_nfts(
|
|
225
|
-
self, address: str, network: str, limit: int, result:
|
|
225
|
+
self, address: str, network: str, limit: int, result: dict[str, Any]
|
|
226
226
|
) -> None:
|
|
227
227
|
"""Fetch NFTs from Solana.
|
|
228
228
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""fetching Solana wallet portfolio."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Dict, List, Optional, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -48,17 +47,17 @@ class SolanaTokenBalance(BaseModel):
|
|
|
48
47
|
token_info: SolanaTokenInfo
|
|
49
48
|
amount: float
|
|
50
49
|
amount_raw: str
|
|
51
|
-
usd_value:
|
|
50
|
+
usd_value: float | None = 0.0
|
|
52
51
|
|
|
53
52
|
|
|
54
53
|
class SolanaNftInfo(BaseModel):
|
|
55
54
|
"""Model for Solana NFT information."""
|
|
56
55
|
|
|
57
56
|
mint: str
|
|
58
|
-
name:
|
|
59
|
-
symbol:
|
|
57
|
+
name: str | None = None
|
|
58
|
+
symbol: str | None = None
|
|
60
59
|
associated_token_address: str
|
|
61
|
-
metadata:
|
|
60
|
+
metadata: dict | None = None
|
|
62
61
|
|
|
63
62
|
|
|
64
63
|
class SolanaPortfolioOutput(BaseModel):
|
|
@@ -67,12 +66,12 @@ class SolanaPortfolioOutput(BaseModel):
|
|
|
67
66
|
address: str
|
|
68
67
|
sol_balance: float
|
|
69
68
|
sol_balance_lamports: int
|
|
70
|
-
sol_price_usd:
|
|
71
|
-
sol_value_usd:
|
|
72
|
-
tokens:
|
|
73
|
-
nfts:
|
|
69
|
+
sol_price_usd: float | None = None
|
|
70
|
+
sol_value_usd: float | None = None
|
|
71
|
+
tokens: list[SolanaTokenBalance] = []
|
|
72
|
+
nfts: list[SolanaNftInfo] = []
|
|
74
73
|
total_value_usd: float = 0.0
|
|
75
|
-
error:
|
|
74
|
+
error: str | None = None
|
|
76
75
|
|
|
77
76
|
|
|
78
77
|
class FetchSolanaPortfolio(WalletBaseTool):
|
|
@@ -91,7 +90,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
|
|
|
91
90
|
"- USD values of assets\n"
|
|
92
91
|
"Use this tool whenever the user asks specifically about Solana holdings."
|
|
93
92
|
)
|
|
94
|
-
args_schema:
|
|
93
|
+
args_schema: type[BaseModel] = SolanaPortfolioInput
|
|
95
94
|
|
|
96
95
|
async def _arun(
|
|
97
96
|
self,
|
|
@@ -136,7 +135,7 @@ class FetchSolanaPortfolio(WalletBaseTool):
|
|
|
136
135
|
self,
|
|
137
136
|
address: str,
|
|
138
137
|
network: str,
|
|
139
|
-
sol_portfolio:
|
|
138
|
+
sol_portfolio: dict,
|
|
140
139
|
include_nfts: bool,
|
|
141
140
|
include_price_data: bool,
|
|
142
141
|
) -> SolanaPortfolioOutput:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""fetching a complete wallet portfolio (EVM + Solana)."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Dict, List, Optional, Type
|
|
5
4
|
|
|
6
5
|
from pydantic import BaseModel, Field
|
|
7
6
|
|
|
@@ -24,7 +23,7 @@ class FetchWalletPortfolioInput(BaseModel):
|
|
|
24
23
|
address: str = Field(
|
|
25
24
|
..., description="Wallet address to analyze (Ethereum or Solana)"
|
|
26
25
|
)
|
|
27
|
-
chains:
|
|
26
|
+
chains: list[int] | None = Field(
|
|
28
27
|
default=None,
|
|
29
28
|
description="List of EVM chain IDs to check (default: all supported)",
|
|
30
29
|
)
|
|
@@ -51,9 +50,9 @@ class PortfolioOutput(BaseModel):
|
|
|
51
50
|
|
|
52
51
|
address: str
|
|
53
52
|
total_net_worth: float
|
|
54
|
-
chains:
|
|
55
|
-
tokens:
|
|
56
|
-
error:
|
|
53
|
+
chains: dict[str, float]
|
|
54
|
+
tokens: list[TokenBalance]
|
|
55
|
+
error: str | None = None
|
|
57
56
|
|
|
58
57
|
|
|
59
58
|
class FetchWalletPortfolio(WalletBaseTool):
|
|
@@ -73,12 +72,12 @@ class FetchWalletPortfolio(WalletBaseTool):
|
|
|
73
72
|
"Use this tool whenever the user asks about their crypto holdings, portfolio value, "
|
|
74
73
|
"or wallet contents across multiple blockchains."
|
|
75
74
|
)
|
|
76
|
-
args_schema:
|
|
75
|
+
args_schema: type[BaseModel] = FetchWalletPortfolioInput
|
|
77
76
|
|
|
78
77
|
async def _arun(
|
|
79
78
|
self,
|
|
80
79
|
address: str,
|
|
81
|
-
chains:
|
|
80
|
+
chains: list[int] | None = None,
|
|
82
81
|
include_solana: bool = True,
|
|
83
82
|
solana_network: str = "mainnet",
|
|
84
83
|
**kwargs,
|
|
@@ -119,7 +118,7 @@ class FetchWalletPortfolio(WalletBaseTool):
|
|
|
119
118
|
)
|
|
120
119
|
|
|
121
120
|
async def _fetch_evm_portfolio(
|
|
122
|
-
self, address: str, chains:
|
|
121
|
+
self, address: str, chains: list[int] | None, portfolio: dict
|
|
123
122
|
) -> None:
|
|
124
123
|
"""Fetch portfolio data for EVM chains.
|
|
125
124
|
|
|
@@ -165,7 +164,7 @@ class FetchWalletPortfolio(WalletBaseTool):
|
|
|
165
164
|
)
|
|
166
165
|
|
|
167
166
|
async def _fetch_solana_portfolio(
|
|
168
|
-
self, address: str, network: str, portfolio:
|
|
167
|
+
self, address: str, network: str, portfolio: dict
|
|
169
168
|
) -> None:
|
|
170
169
|
"""Fetch portfolio data for Solana.
|
|
171
170
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"""Morpho AgentKit skills."""
|
|
2
2
|
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import TypedDict
|
|
4
4
|
|
|
5
5
|
from coinbase_agentkit import morpho_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.morpho.base import MorphoBaseTool
|
|
15
15
|
|
|
16
|
-
if TYPE_CHECKING:
|
|
17
|
-
from intentkit.models.agent import Agent
|
|
18
|
-
|
|
19
16
|
|
|
20
17
|
class SkillStates(TypedDict):
|
|
21
18
|
MorphoActionProvider_deposit: 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[MorphoBaseTool]:
|
|
39
35
|
"""Get all Morpho skills."""
|
|
@@ -46,7 +42,7 @@ async def get_skills(
|
|
|
46
42
|
available_skills.append(skill_name)
|
|
47
43
|
|
|
48
44
|
actions = await get_agentkit_actions(
|
|
49
|
-
agent_id,
|
|
45
|
+
agent_id, [morpho_action_provider], agent=agent
|
|
50
46
|
)
|
|
51
47
|
tools: list[MorphoBaseTool] = []
|
|
52
48
|
for skill in available_skills:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import TypedDict
|
|
3
3
|
|
|
4
|
-
from intentkit.abstracts.skill import SkillStoreABC
|
|
5
4
|
from intentkit.skills.base import SkillConfig, SkillState
|
|
6
5
|
from intentkit.skills.nation.base import NationBaseTool
|
|
7
6
|
from intentkit.skills.nation.nft_check import NftCheck
|
|
@@ -25,7 +24,6 @@ class Config(SkillConfig):
|
|
|
25
24
|
async def get_skills(
|
|
26
25
|
config: "Config",
|
|
27
26
|
is_private: bool,
|
|
28
|
-
store: SkillStoreABC,
|
|
29
27
|
**_,
|
|
30
28
|
) -> list[NationBaseTool]:
|
|
31
29
|
"""Get all nation skills."""
|
|
@@ -42,20 +40,17 @@ async def get_skills(
|
|
|
42
40
|
return [
|
|
43
41
|
skill
|
|
44
42
|
for name in available_skills
|
|
45
|
-
if (skill := get_nation_skill(name
|
|
43
|
+
if (skill := get_nation_skill(name)) is not None
|
|
46
44
|
]
|
|
47
45
|
|
|
48
46
|
|
|
49
47
|
def get_nation_skill(
|
|
50
48
|
name: str,
|
|
51
|
-
|
|
52
|
-
) -> Optional[NationBaseTool]:
|
|
49
|
+
) -> NationBaseTool | None:
|
|
53
50
|
"""Get a nation skill by name."""
|
|
54
51
|
if name == "nft_check":
|
|
55
52
|
if name not in _cache:
|
|
56
|
-
_cache[name] = NftCheck(
|
|
57
|
-
skill_store=store,
|
|
58
|
-
)
|
|
53
|
+
_cache[name] = NftCheck()
|
|
59
54
|
return _cache[name]
|
|
60
55
|
else:
|
|
61
56
|
logger.error(f"Unknown Nation skill: {name}")
|
intentkit/skills/nation/base.py
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
from typing import Type
|
|
2
|
-
|
|
3
1
|
from pydantic import BaseModel, Field
|
|
4
2
|
|
|
5
|
-
from intentkit.
|
|
3
|
+
from intentkit.config.config import config
|
|
6
4
|
from intentkit.skills.base import IntentKitSkill
|
|
7
5
|
|
|
8
6
|
default_nation_api_url = "http://backend-api"
|
|
@@ -13,17 +11,14 @@ class NationBaseTool(IntentKitSkill):
|
|
|
13
11
|
|
|
14
12
|
name: str = Field(description="The name of the tool")
|
|
15
13
|
description: str = Field(description="A description of what the tool does")
|
|
16
|
-
args_schema:
|
|
17
|
-
skill_store: SkillStoreABC = Field(
|
|
18
|
-
description="The skill store for persisting data"
|
|
19
|
-
)
|
|
14
|
+
args_schema: type[BaseModel]
|
|
20
15
|
|
|
21
16
|
def get_api_key(self) -> str:
|
|
22
|
-
return
|
|
17
|
+
return config.nation_api_key
|
|
23
18
|
|
|
24
19
|
def get_base_url(self) -> str:
|
|
25
|
-
if
|
|
26
|
-
return
|
|
20
|
+
if config.nation_api_url:
|
|
21
|
+
return config.nation_api_url
|
|
27
22
|
return default_nation_api_url
|
|
28
23
|
|
|
29
24
|
@property
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import Optional, Type
|
|
3
2
|
|
|
4
3
|
import httpx
|
|
5
4
|
from eth_utils import is_address
|
|
@@ -11,7 +10,7 @@ logger = logging.getLogger(__name__)
|
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
class NftCheckInput(BaseModel):
|
|
14
|
-
nation_wallet_address:
|
|
13
|
+
nation_wallet_address: str | None = Field(
|
|
15
14
|
default=None, description="Nation wallet address"
|
|
16
15
|
)
|
|
17
16
|
|
|
@@ -19,9 +18,9 @@ class NftCheckInput(BaseModel):
|
|
|
19
18
|
class NftCheck(NationBaseTool):
|
|
20
19
|
name: str = "nft_check"
|
|
21
20
|
description: str = "Check user nation pass NFTs stats in nation, including usage status and linked agents.By default, it will use the user_id as the wallet address. If you want to check other wallet address, please pass the nation_wallet_address parameter."
|
|
22
|
-
args_schema:
|
|
21
|
+
args_schema: type[BaseModel] = NftCheckInput
|
|
23
22
|
|
|
24
|
-
async def _arun(self, nation_wallet_address:
|
|
23
|
+
async def _arun(self, nation_wallet_address: str | None = None) -> str:
|
|
25
24
|
"""Implementation of the NFT Check tool.
|
|
26
25
|
|
|
27
26
|
Args:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from cdp import EvmServerAccount
|
|
2
|
+
from web3 import Web3
|
|
3
|
+
|
|
4
|
+
from intentkit.clients import get_evm_account as fetch_evm_account
|
|
5
|
+
from intentkit.clients.web3 import get_web3_client
|
|
6
|
+
from intentkit.skills.base import IntentKitSkill
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class IntentKitOnChainSkill(IntentKitSkill):
|
|
10
|
+
"""Shared helpers for on-chain enabled skills."""
|
|
11
|
+
|
|
12
|
+
def web3_client(self) -> Web3:
|
|
13
|
+
"""Get a Web3 client for the active agent network."""
|
|
14
|
+
context = self.get_context()
|
|
15
|
+
agent = context.agent
|
|
16
|
+
network_id = agent.network_id
|
|
17
|
+
return get_web3_client(network_id)
|
|
18
|
+
|
|
19
|
+
async def get_evm_account(self) -> EvmServerAccount:
|
|
20
|
+
"""Fetch the EVM account associated with the active agent."""
|
|
21
|
+
context = self.get_context()
|
|
22
|
+
agent = context.agent
|
|
23
|
+
return await fetch_evm_account(agent)
|
|
@@ -3,11 +3,12 @@
|
|
|
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.openai.base import OpenAIBaseTool
|
|
9
8
|
from intentkit.skills.openai.dalle_image_generation import DALLEImageGeneration
|
|
9
|
+
from intentkit.skills.openai.gpt_avatar_generator import GPTAvatarGenerator
|
|
10
10
|
from intentkit.skills.openai.gpt_image_generation import GPTImageGeneration
|
|
11
|
+
from intentkit.skills.openai.gpt_image_mini_generator import GPTImageMiniGenerator
|
|
11
12
|
from intentkit.skills.openai.gpt_image_to_image import GPTImageToImage
|
|
12
13
|
from intentkit.skills.openai.image_to_text import ImageToText
|
|
13
14
|
|
|
@@ -21,6 +22,8 @@ class SkillStates(TypedDict):
|
|
|
21
22
|
image_to_text: SkillState
|
|
22
23
|
dalle_image_generation: SkillState
|
|
23
24
|
gpt_image_generation: SkillState
|
|
25
|
+
gpt_image_mini_generator: SkillState
|
|
26
|
+
gpt_avatar_generator: SkillState
|
|
24
27
|
gpt_image_to_image: SkillState
|
|
25
28
|
|
|
26
29
|
|
|
@@ -34,7 +37,6 @@ class Config(SkillConfig):
|
|
|
34
37
|
async def get_skills(
|
|
35
38
|
config: "Config",
|
|
36
39
|
is_private: bool,
|
|
37
|
-
store: SkillStoreABC,
|
|
38
40
|
**_,
|
|
39
41
|
) -> list[OpenAIBaseTool]:
|
|
40
42
|
"""Get all OpenAI skills.
|
|
@@ -42,7 +44,6 @@ async def get_skills(
|
|
|
42
44
|
Args:
|
|
43
45
|
config: The configuration for OpenAI skills.
|
|
44
46
|
is_private: Whether to include private skills.
|
|
45
|
-
store: The skill store for persisting data.
|
|
46
47
|
|
|
47
48
|
Returns:
|
|
48
49
|
A list of OpenAI skills.
|
|
@@ -59,7 +60,7 @@ async def get_skills(
|
|
|
59
60
|
# Get each skill using the cached getter
|
|
60
61
|
result = []
|
|
61
62
|
for name in available_skills:
|
|
62
|
-
skill = get_openai_skill(name
|
|
63
|
+
skill = get_openai_skill(name)
|
|
63
64
|
if skill:
|
|
64
65
|
result.append(skill)
|
|
65
66
|
return result
|
|
@@ -67,40 +68,38 @@ async def get_skills(
|
|
|
67
68
|
|
|
68
69
|
def get_openai_skill(
|
|
69
70
|
name: str,
|
|
70
|
-
store: SkillStoreABC,
|
|
71
71
|
) -> OpenAIBaseTool:
|
|
72
72
|
"""Get an OpenAI skill by name.
|
|
73
73
|
|
|
74
74
|
Args:
|
|
75
75
|
name: The name of the skill to get
|
|
76
|
-
store: The skill store for persisting data
|
|
77
76
|
|
|
78
77
|
Returns:
|
|
79
78
|
The requested OpenAI skill
|
|
80
79
|
"""
|
|
81
80
|
if name == "image_to_text":
|
|
82
81
|
if name not in _cache:
|
|
83
|
-
_cache[name] = ImageToText(
|
|
84
|
-
skill_store=store,
|
|
85
|
-
)
|
|
82
|
+
_cache[name] = ImageToText()
|
|
86
83
|
return _cache[name]
|
|
87
84
|
elif name == "dalle_image_generation":
|
|
88
85
|
if name not in _cache:
|
|
89
|
-
_cache[name] = DALLEImageGeneration(
|
|
90
|
-
skill_store=store,
|
|
91
|
-
)
|
|
86
|
+
_cache[name] = DALLEImageGeneration()
|
|
92
87
|
return _cache[name]
|
|
93
88
|
elif name == "gpt_image_generation":
|
|
94
89
|
if name not in _cache:
|
|
95
|
-
_cache[name] = GPTImageGeneration(
|
|
96
|
-
|
|
97
|
-
|
|
90
|
+
_cache[name] = GPTImageGeneration()
|
|
91
|
+
return _cache[name]
|
|
92
|
+
elif name == "gpt_image_mini_generator":
|
|
93
|
+
if name not in _cache:
|
|
94
|
+
_cache[name] = GPTImageMiniGenerator()
|
|
95
|
+
return _cache[name]
|
|
96
|
+
elif name == "gpt_avatar_generator":
|
|
97
|
+
if name not in _cache:
|
|
98
|
+
_cache[name] = GPTAvatarGenerator()
|
|
98
99
|
return _cache[name]
|
|
99
100
|
elif name == "gpt_image_to_image":
|
|
100
101
|
if name not in _cache:
|
|
101
|
-
_cache[name] = GPTImageToImage(
|
|
102
|
-
skill_store=store,
|
|
103
|
-
)
|
|
102
|
+
_cache[name] = GPTImageToImage()
|
|
104
103
|
return _cache[name]
|
|
105
104
|
else:
|
|
106
105
|
logger.warning(f"Unknown OpenAI skill: {name}")
|
intentkit/skills/openai/base.py
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
"""Base class for OpenAI skills."""
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
from langchain.tools.base import ToolException
|
|
3
|
+
from langchain_core.tools.base import ToolException
|
|
6
4
|
from pydantic import BaseModel, Field
|
|
7
5
|
|
|
8
|
-
from intentkit.
|
|
6
|
+
from intentkit.config.config import config
|
|
9
7
|
from intentkit.skills.base import IntentKitSkill
|
|
10
8
|
|
|
11
9
|
|
|
@@ -17,24 +15,22 @@ class OpenAIBaseTool(IntentKitSkill):
|
|
|
17
15
|
|
|
18
16
|
name: str = Field(description="The name of the tool")
|
|
19
17
|
description: str = Field(description="A description of what the tool does")
|
|
20
|
-
args_schema:
|
|
21
|
-
skill_store: SkillStoreABC = Field(
|
|
22
|
-
description="The skill store for persisting data"
|
|
23
|
-
)
|
|
18
|
+
args_schema: type[BaseModel]
|
|
24
19
|
|
|
25
20
|
def get_api_key(self) -> str:
|
|
26
21
|
context = self.get_context()
|
|
27
22
|
skill_config = context.agent.skill_config(self.category)
|
|
28
23
|
api_key_provider = skill_config.get("api_key_provider")
|
|
29
24
|
if api_key_provider == "platform":
|
|
30
|
-
|
|
25
|
+
if not config.openai_api_key:
|
|
26
|
+
raise ToolException("OpenAI API key is not configured")
|
|
27
|
+
return config.openai_api_key
|
|
31
28
|
# for backward compatibility, may only have api_key in skill_config
|
|
32
|
-
|
|
29
|
+
if skill_config.get("api_key"):
|
|
33
30
|
return skill_config.get("api_key")
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
)
|
|
31
|
+
raise ToolException(
|
|
32
|
+
f"Invalid API key provider: {api_key_provider}, or no api_key in config"
|
|
33
|
+
)
|
|
38
34
|
|
|
39
35
|
@property
|
|
40
36
|
def category(self) -> str:
|