intentkit 0.7.5.dev3__py3-none-any.whl → 0.8.34.dev7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- intentkit/MANIFEST.in +14 -0
- intentkit/README.md +88 -0
- intentkit/__init__.py +6 -4
- intentkit/abstracts/agent.py +4 -5
- intentkit/abstracts/engine.py +5 -5
- intentkit/abstracts/graph.py +15 -8
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +9 -2
- intentkit/clients/cdp.py +129 -153
- intentkit/{utils → clients}/s3.py +109 -34
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +4 -7
- intentkit/config/config.py +123 -90
- intentkit/core/account_checking.py +802 -0
- intentkit/core/agent.py +313 -498
- intentkit/core/asset.py +267 -0
- intentkit/core/chat.py +5 -3
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +49 -41
- intentkit/core/draft.py +201 -0
- intentkit/core/draft_chat.py +118 -0
- intentkit/core/engine.py +378 -287
- intentkit/core/manager/__init__.py +25 -0
- intentkit/core/manager/engine.py +220 -0
- intentkit/core/manager/service.py +172 -0
- intentkit/core/manager/skills.py +178 -0
- intentkit/core/middleware.py +231 -0
- intentkit/core/prompt.py +74 -114
- intentkit/core/scheduler.py +143 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +931 -518
- intentkit/models/agent_data.py +165 -106
- intentkit/models/agent_schema.json +38 -251
- intentkit/models/app_setting.py +15 -13
- intentkit/models/chat.py +86 -140
- intentkit/models/credit.py +182 -162
- intentkit/models/db.py +42 -23
- intentkit/models/db_mig.py +120 -3
- intentkit/models/draft.py +222 -0
- intentkit/models/llm.csv +31 -0
- intentkit/models/llm.py +262 -370
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +222 -101
- intentkit/models/skills.csv +173 -0
- intentkit/models/team.py +189 -0
- intentkit/models/user.py +103 -31
- intentkit/skills/acolyt/__init__.py +2 -9
- intentkit/skills/acolyt/ask.py +3 -4
- intentkit/skills/acolyt/base.py +4 -9
- intentkit/skills/acolyt/schema.json +4 -3
- intentkit/skills/aixbt/__init__.py +2 -13
- intentkit/skills/aixbt/base.py +1 -7
- intentkit/skills/aixbt/projects.py +14 -15
- intentkit/skills/aixbt/schema.json +4 -4
- intentkit/skills/allora/__init__.py +2 -9
- intentkit/skills/allora/base.py +4 -9
- intentkit/skills/allora/price.py +3 -4
- intentkit/skills/allora/schema.json +3 -2
- intentkit/skills/base.py +241 -41
- intentkit/skills/basename/__init__.py +51 -0
- intentkit/skills/basename/base.py +11 -0
- intentkit/skills/basename/basename.svg +11 -0
- intentkit/skills/basename/schema.json +58 -0
- intentkit/skills/carv/__init__.py +115 -121
- intentkit/skills/carv/base.py +184 -185
- intentkit/skills/carv/fetch_news.py +3 -3
- intentkit/skills/carv/onchain_query.py +4 -4
- intentkit/skills/carv/schema.json +134 -137
- intentkit/skills/carv/token_info_and_price.py +6 -6
- intentkit/skills/casino/__init__.py +4 -15
- intentkit/skills/casino/base.py +1 -7
- intentkit/skills/casino/deck_draw.py +5 -8
- intentkit/skills/casino/deck_shuffle.py +6 -6
- intentkit/skills/casino/dice_roll.py +2 -4
- intentkit/skills/casino/schema.json +0 -1
- intentkit/skills/cdp/__init__.py +22 -84
- intentkit/skills/cdp/base.py +1 -7
- intentkit/skills/cdp/schema.json +11 -314
- intentkit/skills/chainlist/__init__.py +2 -7
- intentkit/skills/chainlist/base.py +1 -7
- intentkit/skills/chainlist/chain_lookup.py +18 -18
- intentkit/skills/chainlist/schema.json +3 -5
- intentkit/skills/common/__init__.py +2 -9
- intentkit/skills/common/base.py +1 -7
- intentkit/skills/common/current_time.py +1 -2
- intentkit/skills/common/schema.json +2 -2
- intentkit/skills/cookiefun/__init__.py +6 -9
- intentkit/skills/cookiefun/base.py +2 -7
- intentkit/skills/cookiefun/get_account_details.py +7 -7
- intentkit/skills/cookiefun/get_account_feed.py +19 -19
- intentkit/skills/cookiefun/get_account_smart_followers.py +7 -7
- intentkit/skills/cookiefun/get_sectors.py +3 -3
- intentkit/skills/cookiefun/schema.json +1 -3
- intentkit/skills/cookiefun/search_accounts.py +9 -9
- intentkit/skills/cryptocompare/__init__.py +7 -24
- intentkit/skills/cryptocompare/api.py +2 -3
- intentkit/skills/cryptocompare/base.py +10 -24
- intentkit/skills/cryptocompare/fetch_news.py +4 -5
- intentkit/skills/cryptocompare/fetch_price.py +6 -7
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +4 -5
- intentkit/skills/cryptocompare/fetch_top_volume.py +4 -5
- intentkit/skills/cryptocompare/fetch_trading_signals.py +5 -6
- intentkit/skills/cryptocompare/schema.json +3 -3
- intentkit/skills/cryptopanic/__init__.py +7 -10
- intentkit/skills/cryptopanic/base.py +51 -55
- intentkit/skills/cryptopanic/fetch_crypto_news.py +4 -8
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +5 -7
- intentkit/skills/cryptopanic/schema.json +105 -103
- intentkit/skills/dapplooker/__init__.py +2 -9
- intentkit/skills/dapplooker/base.py +4 -9
- intentkit/skills/dapplooker/dapplooker_token_data.py +7 -7
- intentkit/skills/dapplooker/schema.json +3 -5
- intentkit/skills/defillama/__init__.py +24 -74
- intentkit/skills/defillama/api.py +6 -9
- intentkit/skills/defillama/base.py +8 -19
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_block.py +6 -8
- intentkit/skills/defillama/coins/fetch_current_prices.py +8 -10
- intentkit/skills/defillama/coins/fetch_first_price.py +7 -9
- intentkit/skills/defillama/coins/fetch_historical_prices.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_chart.py +9 -11
- intentkit/skills/defillama/coins/fetch_price_percentage.py +7 -9
- intentkit/skills/defillama/config/chains.py +1 -3
- intentkit/skills/defillama/fees/fetch_fees_overview.py +24 -26
- intentkit/skills/defillama/schema.json +5 -1
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +16 -18
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +8 -10
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +5 -7
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +7 -9
- intentkit/skills/defillama/tests/api_integration.test.py +1 -1
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_chains.py +9 -11
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +4 -6
- intentkit/skills/defillama/tvl/fetch_protocol.py +32 -38
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +3 -5
- intentkit/skills/defillama/tvl/fetch_protocols.py +37 -45
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +42 -48
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +35 -37
- intentkit/skills/defillama/volumes/fetch_options_overview.py +24 -28
- intentkit/skills/defillama/yields/fetch_pool_chart.py +10 -12
- intentkit/skills/defillama/yields/fetch_pools.py +26 -30
- intentkit/skills/dexscreener/__init__.py +97 -102
- intentkit/skills/dexscreener/base.py +125 -130
- intentkit/skills/dexscreener/get_pair_info.py +4 -5
- intentkit/skills/dexscreener/get_token_pairs.py +4 -5
- intentkit/skills/dexscreener/get_tokens_info.py +7 -8
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -93
- intentkit/skills/dexscreener/search_token.py +182 -184
- intentkit/skills/dexscreener/utils.py +15 -14
- intentkit/skills/dune_analytics/__init__.py +7 -9
- intentkit/skills/dune_analytics/base.py +48 -52
- intentkit/skills/dune_analytics/fetch_kol_buys.py +5 -7
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +6 -8
- intentkit/skills/dune_analytics/schema.json +104 -99
- intentkit/skills/elfa/__init__.py +5 -18
- intentkit/skills/elfa/base.py +10 -14
- intentkit/skills/elfa/mention.py +19 -21
- intentkit/skills/elfa/schema.json +3 -2
- intentkit/skills/elfa/stats.py +4 -4
- intentkit/skills/elfa/tokens.py +12 -12
- intentkit/skills/elfa/utils.py +26 -28
- intentkit/skills/enso/__init__.py +11 -31
- intentkit/skills/enso/base.py +54 -35
- intentkit/skills/enso/best_yield.py +16 -24
- intentkit/skills/enso/networks.py +6 -11
- intentkit/skills/enso/prices.py +11 -13
- intentkit/skills/enso/route.py +34 -38
- intentkit/skills/enso/schema.json +3 -2
- intentkit/skills/enso/tokens.py +29 -38
- intentkit/skills/enso/wallet.py +76 -191
- intentkit/skills/erc20/__init__.py +50 -0
- intentkit/skills/erc20/base.py +11 -0
- intentkit/skills/erc20/erc20.svg +5 -0
- intentkit/skills/erc20/schema.json +74 -0
- intentkit/skills/erc721/__init__.py +53 -0
- intentkit/skills/erc721/base.py +11 -0
- intentkit/skills/erc721/erc721.svg +5 -0
- intentkit/skills/erc721/schema.json +90 -0
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -9
- intentkit/skills/firecrawl/clear.py +4 -8
- intentkit/skills/firecrawl/crawl.py +19 -19
- intentkit/skills/firecrawl/query.py +4 -3
- intentkit/skills/firecrawl/schema.json +2 -6
- intentkit/skills/firecrawl/scrape.py +17 -22
- intentkit/skills/firecrawl/utils.py +50 -42
- intentkit/skills/github/__init__.py +2 -7
- intentkit/skills/github/base.py +1 -7
- intentkit/skills/github/github_search.py +1 -2
- intentkit/skills/github/schema.json +3 -4
- intentkit/skills/heurist/__init__.py +8 -27
- intentkit/skills/heurist/base.py +4 -9
- intentkit/skills/heurist/image_generation_animagine_xl.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_comics.py +13 -15
- intentkit/skills/heurist/image_generation_arthemy_real.py +13 -15
- intentkit/skills/heurist/image_generation_braindance.py +13 -15
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +13 -15
- intentkit/skills/heurist/image_generation_flux_1_dev.py +13 -15
- intentkit/skills/heurist/image_generation_sdxl.py +13 -15
- intentkit/skills/heurist/schema.json +2 -2
- intentkit/skills/http/__init__.py +4 -15
- intentkit/skills/http/base.py +1 -7
- intentkit/skills/http/get.py +21 -16
- intentkit/skills/http/post.py +23 -18
- intentkit/skills/http/put.py +23 -18
- intentkit/skills/http/schema.json +4 -5
- intentkit/skills/lifi/__init__.py +8 -13
- intentkit/skills/lifi/base.py +3 -9
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +150 -60
- intentkit/skills/lifi/token_quote.py +8 -10
- intentkit/skills/lifi/utils.py +104 -51
- intentkit/skills/moralis/__init__.py +6 -10
- intentkit/skills/moralis/api.py +6 -7
- intentkit/skills/moralis/base.py +5 -10
- intentkit/skills/moralis/fetch_chain_portfolio.py +10 -11
- intentkit/skills/moralis/fetch_nft_portfolio.py +22 -22
- intentkit/skills/moralis/fetch_solana_portfolio.py +11 -12
- intentkit/skills/moralis/fetch_wallet_portfolio.py +8 -9
- intentkit/skills/moralis/schema.json +7 -2
- intentkit/skills/morpho/__init__.py +52 -0
- intentkit/skills/morpho/base.py +11 -0
- intentkit/skills/morpho/morpho.svg +12 -0
- intentkit/skills/morpho/schema.json +73 -0
- intentkit/skills/nation/__init__.py +4 -9
- intentkit/skills/nation/base.py +5 -10
- intentkit/skills/nation/nft_check.py +3 -4
- intentkit/skills/nation/schema.json +4 -3
- intentkit/skills/onchain.py +30 -0
- intentkit/skills/openai/__init__.py +17 -18
- intentkit/skills/openai/base.py +10 -14
- intentkit/skills/openai/dalle_image_generation.py +4 -9
- intentkit/skills/openai/gpt_avatar_generator.py +102 -0
- intentkit/skills/openai/gpt_image_generation.py +5 -9
- intentkit/skills/openai/gpt_image_mini_generator.py +92 -0
- intentkit/skills/openai/gpt_image_to_image.py +5 -9
- intentkit/skills/openai/image_to_text.py +3 -7
- intentkit/skills/openai/schema.json +34 -3
- intentkit/skills/portfolio/__init__.py +11 -35
- intentkit/skills/portfolio/base.py +33 -19
- intentkit/skills/portfolio/schema.json +3 -5
- intentkit/skills/portfolio/token_balances.py +21 -21
- intentkit/skills/portfolio/wallet_approvals.py +17 -18
- intentkit/skills/portfolio/wallet_defi_positions.py +3 -3
- intentkit/skills/portfolio/wallet_history.py +31 -31
- intentkit/skills/portfolio/wallet_net_worth.py +13 -13
- intentkit/skills/portfolio/wallet_nfts.py +19 -19
- intentkit/skills/portfolio/wallet_profitability.py +18 -18
- intentkit/skills/portfolio/wallet_profitability_summary.py +5 -5
- intentkit/skills/portfolio/wallet_stats.py +3 -3
- intentkit/skills/portfolio/wallet_swaps.py +19 -19
- intentkit/skills/pyth/__init__.py +50 -0
- intentkit/skills/pyth/base.py +11 -0
- intentkit/skills/pyth/pyth.svg +6 -0
- intentkit/skills/pyth/schema.json +75 -0
- intentkit/skills/skills.toml +36 -0
- intentkit/skills/slack/__init__.py +5 -17
- intentkit/skills/slack/base.py +3 -9
- intentkit/skills/slack/get_channel.py +8 -8
- intentkit/skills/slack/get_message.py +9 -9
- intentkit/skills/slack/schedule_message.py +5 -5
- intentkit/skills/slack/schema.json +2 -2
- intentkit/skills/slack/send_message.py +3 -5
- intentkit/skills/supabase/__init__.py +7 -23
- intentkit/skills/supabase/base.py +1 -7
- intentkit/skills/supabase/delete_data.py +4 -4
- intentkit/skills/supabase/fetch_data.py +12 -12
- intentkit/skills/supabase/insert_data.py +4 -4
- intentkit/skills/supabase/invoke_function.py +6 -6
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +6 -6
- intentkit/skills/supabase/upsert_data.py +4 -4
- intentkit/skills/superfluid/__init__.py +53 -0
- intentkit/skills/superfluid/base.py +11 -0
- intentkit/skills/superfluid/schema.json +89 -0
- intentkit/skills/superfluid/superfluid.svg +6 -0
- intentkit/skills/system/__init__.py +7 -24
- intentkit/skills/system/add_autonomous_task.py +10 -12
- intentkit/skills/system/delete_autonomous_task.py +2 -2
- intentkit/skills/system/edit_autonomous_task.py +14 -18
- intentkit/skills/system/list_autonomous_tasks.py +3 -5
- intentkit/skills/system/read_agent_api_key.py +6 -4
- intentkit/skills/system/regenerate_agent_api_key.py +6 -4
- intentkit/skills/system/schema.json +6 -8
- intentkit/skills/tavily/__init__.py +3 -12
- intentkit/skills/tavily/base.py +4 -9
- intentkit/skills/tavily/schema.json +3 -5
- intentkit/skills/tavily/tavily_extract.py +2 -4
- intentkit/skills/tavily/tavily_search.py +4 -6
- intentkit/skills/token/__init__.py +5 -10
- intentkit/skills/token/base.py +7 -11
- intentkit/skills/token/erc20_transfers.py +19 -19
- intentkit/skills/token/schema.json +3 -6
- intentkit/skills/token/token_analytics.py +3 -3
- intentkit/skills/token/token_price.py +13 -13
- intentkit/skills/token/token_search.py +9 -9
- intentkit/skills/twitter/__init__.py +11 -35
- intentkit/skills/twitter/base.py +22 -34
- intentkit/skills/twitter/follow_user.py +2 -6
- intentkit/skills/twitter/get_mentions.py +5 -12
- intentkit/skills/twitter/get_timeline.py +4 -12
- intentkit/skills/twitter/get_user_by_username.py +2 -6
- intentkit/skills/twitter/get_user_tweets.py +5 -13
- intentkit/skills/twitter/like_tweet.py +2 -6
- intentkit/skills/twitter/post_tweet.py +6 -9
- intentkit/skills/twitter/reply_tweet.py +6 -9
- intentkit/skills/twitter/retweet.py +2 -6
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +4 -12
- intentkit/skills/unrealspeech/__init__.py +2 -7
- intentkit/skills/unrealspeech/base.py +2 -8
- intentkit/skills/unrealspeech/schema.json +2 -5
- intentkit/skills/unrealspeech/text_to_speech.py +8 -8
- intentkit/skills/venice_audio/__init__.py +98 -106
- intentkit/skills/venice_audio/base.py +117 -121
- intentkit/skills/venice_audio/input.py +41 -41
- intentkit/skills/venice_audio/schema.json +151 -152
- intentkit/skills/venice_audio/venice_audio.py +38 -21
- intentkit/skills/venice_image/__init__.py +147 -154
- intentkit/skills/venice_image/api.py +138 -138
- intentkit/skills/venice_image/base.py +185 -192
- intentkit/skills/venice_image/config.py +33 -35
- intentkit/skills/venice_image/image_enhance/image_enhance.py +2 -3
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +21 -23
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +38 -40
- intentkit/skills/venice_image/image_generation/image_generation_base.py +11 -10
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -27
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -158
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -26
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -28
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -28
- intentkit/skills/venice_image/image_upscale/image_upscale.py +3 -3
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +21 -23
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -22
- intentkit/skills/venice_image/image_vision/image_vision.py +2 -2
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -17
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -9
- intentkit/skills/venice_image/schema.json +267 -267
- intentkit/skills/venice_image/utils.py +77 -78
- intentkit/skills/web_scraper/__init__.py +5 -18
- intentkit/skills/web_scraper/base.py +21 -7
- intentkit/skills/web_scraper/document_indexer.py +7 -6
- intentkit/skills/web_scraper/schema.json +2 -6
- intentkit/skills/web_scraper/scrape_and_index.py +15 -15
- intentkit/skills/web_scraper/utils.py +62 -63
- intentkit/skills/web_scraper/website_indexer.py +17 -19
- intentkit/skills/weth/__init__.py +49 -0
- intentkit/skills/weth/base.py +11 -0
- intentkit/skills/weth/schema.json +58 -0
- intentkit/skills/weth/weth.svg +6 -0
- intentkit/skills/wow/__init__.py +51 -0
- intentkit/skills/wow/base.py +11 -0
- intentkit/skills/wow/schema.json +89 -0
- intentkit/skills/wow/wow.svg +7 -0
- intentkit/skills/x402/__init__.py +58 -0
- intentkit/skills/x402/base.py +99 -0
- intentkit/skills/x402/http_request.py +117 -0
- intentkit/skills/x402/schema.json +40 -0
- intentkit/skills/x402/x402.webp +0 -0
- intentkit/skills/xmtp/__init__.py +4 -15
- intentkit/skills/xmtp/base.py +5 -5
- intentkit/skills/xmtp/price.py +7 -6
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +6 -8
- intentkit/skills/xmtp/transfer.py +4 -6
- intentkit/utils/__init__.py +4 -0
- intentkit/utils/chain.py +198 -96
- intentkit/utils/ens.py +135 -0
- intentkit/utils/error.py +5 -2
- intentkit/utils/logging.py +9 -11
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +8 -8
- intentkit/utils/tx.py +16 -8
- intentkit/uv.lock +3377 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/METADATA +13 -15
- intentkit-0.8.34.dev7.dist-info/RECORD +478 -0
- intentkit-0.8.34.dev7.dist-info/licenses/LICENSE +21 -0
- intentkit/core/node.py +0 -215
- intentkit/models/conversation.py +0 -286
- intentkit/models/generator.py +0 -347
- intentkit/skills/cdp/get_balance.py +0 -110
- intentkit/skills/cdp/swap.py +0 -121
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +0 -511
- intentkit-0.7.5.dev3.dist-info/RECORD +0 -424
- {intentkit-0.7.5.dev3.dist-info/licenses → intentkit}/LICENSE +0 -0
- {intentkit-0.7.5.dev3.dist-info → intentkit-0.8.34.dev7.dist-info}/WHEEL +0 -0
|
@@ -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
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Morpho AgentKit skills."""
|
|
2
|
+
|
|
3
|
+
from typing import TypedDict
|
|
4
|
+
|
|
5
|
+
from coinbase_agentkit import morpho_action_provider
|
|
6
|
+
|
|
7
|
+
from intentkit.models.agent import Agent
|
|
8
|
+
from intentkit.skills.base import (
|
|
9
|
+
SkillConfig,
|
|
10
|
+
SkillState,
|
|
11
|
+
action_to_structured_tool,
|
|
12
|
+
get_agentkit_actions,
|
|
13
|
+
)
|
|
14
|
+
from intentkit.skills.morpho.base import MorphoBaseTool
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SkillStates(TypedDict):
|
|
18
|
+
MorphoActionProvider_deposit: SkillState
|
|
19
|
+
MorphoActionProvider_withdraw: SkillState
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Config(SkillConfig):
|
|
23
|
+
"""Configuration for Morpho skills."""
|
|
24
|
+
|
|
25
|
+
states: SkillStates
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def get_skills(
|
|
29
|
+
config: Config,
|
|
30
|
+
is_private: bool,
|
|
31
|
+
agent_id: str,
|
|
32
|
+
agent: Agent | None = None,
|
|
33
|
+
**_,
|
|
34
|
+
) -> list[MorphoBaseTool]:
|
|
35
|
+
"""Get all Morpho skills."""
|
|
36
|
+
|
|
37
|
+
available_skills: list[str] = []
|
|
38
|
+
for skill_name, state in config["states"].items():
|
|
39
|
+
if state == "disabled":
|
|
40
|
+
continue
|
|
41
|
+
if state == "public" or (state == "private" and is_private):
|
|
42
|
+
available_skills.append(skill_name)
|
|
43
|
+
|
|
44
|
+
actions = await get_agentkit_actions(
|
|
45
|
+
agent_id, [morpho_action_provider], agent=agent
|
|
46
|
+
)
|
|
47
|
+
tools: list[MorphoBaseTool] = []
|
|
48
|
+
for skill in available_skills:
|
|
49
|
+
for action in actions:
|
|
50
|
+
if action.name.endswith(skill):
|
|
51
|
+
tools.append(action_to_structured_tool(action))
|
|
52
|
+
return tools
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
|
2
|
+
<defs>
|
|
3
|
+
<radialGradient id="morpho" cx="50%" cy="50%" r="70%">
|
|
4
|
+
<stop offset="0%" stop-color="#82f3ff" />
|
|
5
|
+
<stop offset="100%" stop-color="#006064" />
|
|
6
|
+
</radialGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="128" height="128" fill="#004d40" rx="16" />
|
|
9
|
+
<circle cx="64" cy="48" r="28" fill="url(#morpho)" />
|
|
10
|
+
<rect x="36" y="72" width="56" height="20" rx="10" fill="#26a69a" />
|
|
11
|
+
<text x="50%" y="84%" font-family="Arial,Helvetica,sans-serif" font-size="18" fill="#e0f2f1" font-weight="600" text-anchor="middle">Morpho</text>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Morpho",
|
|
5
|
+
"description": "Morpho lending actions via Coinbase AgentKit",
|
|
6
|
+
"x-icon": "https://ai.service.crestal.dev/skills/morpho/morpho.svg",
|
|
7
|
+
"x-tags": [
|
|
8
|
+
"DeFi"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"enabled": {
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"title": "Enabled",
|
|
14
|
+
"description": "Whether this skill is enabled",
|
|
15
|
+
"default": false
|
|
16
|
+
},
|
|
17
|
+
"states": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"MorphoActionProvider_deposit": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"title": "Deposit",
|
|
23
|
+
"enum": [
|
|
24
|
+
"disabled",
|
|
25
|
+
"public",
|
|
26
|
+
"private"
|
|
27
|
+
],
|
|
28
|
+
"x-enum-title": [
|
|
29
|
+
"Disabled",
|
|
30
|
+
"Agent Owner + All Users",
|
|
31
|
+
"Agent Owner Only"
|
|
32
|
+
],
|
|
33
|
+
"description": "State for MorphoActionProvider_deposit",
|
|
34
|
+
"default": "disabled"
|
|
35
|
+
},
|
|
36
|
+
"MorphoActionProvider_withdraw": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"title": "Withdraw",
|
|
39
|
+
"enum": [
|
|
40
|
+
"disabled",
|
|
41
|
+
"public",
|
|
42
|
+
"private"
|
|
43
|
+
],
|
|
44
|
+
"x-enum-title": [
|
|
45
|
+
"Disabled",
|
|
46
|
+
"Agent Owner + All Users",
|
|
47
|
+
"Agent Owner Only"
|
|
48
|
+
],
|
|
49
|
+
"description": "State for MorphoActionProvider_withdraw",
|
|
50
|
+
"default": "disabled"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"description": "States for each Morpho skill (disabled, public, or private)"
|
|
54
|
+
},
|
|
55
|
+
"api_key_provider": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"title": "API Key Provider",
|
|
58
|
+
"description": "Who provides the API key",
|
|
59
|
+
"enum": [
|
|
60
|
+
"platform"
|
|
61
|
+
],
|
|
62
|
+
"x-enum-title": [
|
|
63
|
+
"Nation Hosted"
|
|
64
|
+
],
|
|
65
|
+
"default": "platform"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"required": [
|
|
69
|
+
"states",
|
|
70
|
+
"enabled"
|
|
71
|
+
],
|
|
72
|
+
"additionalProperties": true
|
|
73
|
+
}
|
|
@@ -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:
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
"description": "Check nation NFT stats",
|
|
6
6
|
"x-icon": "https://ai.service.crestal.dev/skills/nation/nation.png",
|
|
7
7
|
"x-tags": [
|
|
8
|
-
"
|
|
9
|
-
"
|
|
8
|
+
"Analytics",
|
|
9
|
+
"Crypto",
|
|
10
|
+
"NFT"
|
|
10
11
|
],
|
|
11
12
|
"properties": {
|
|
12
13
|
"enabled": {
|
|
@@ -55,4 +56,4 @@
|
|
|
55
56
|
"enabled"
|
|
56
57
|
],
|
|
57
58
|
"additionalProperties": true
|
|
58
|
-
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from cdp import EvmServerAccount
|
|
2
|
+
from web3 import Web3
|
|
3
|
+
|
|
4
|
+
from intentkit.clients import get_cdp_network as resolve_cdp_network
|
|
5
|
+
from intentkit.clients import get_evm_account as fetch_evm_account
|
|
6
|
+
from intentkit.clients.web3 import get_web3_client
|
|
7
|
+
from intentkit.skills.base import IntentKitSkill
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class IntentKitOnChainSkill(IntentKitSkill):
|
|
11
|
+
"""Shared helpers for on-chain enabled skills."""
|
|
12
|
+
|
|
13
|
+
def web3_client(self) -> Web3:
|
|
14
|
+
"""Get a Web3 client for the active agent network."""
|
|
15
|
+
context = self.get_context()
|
|
16
|
+
agent = context.agent
|
|
17
|
+
network_id = agent.network_id
|
|
18
|
+
return get_web3_client(network_id)
|
|
19
|
+
|
|
20
|
+
async def get_evm_account(self) -> EvmServerAccount:
|
|
21
|
+
"""Fetch the EVM account associated with the active agent."""
|
|
22
|
+
context = self.get_context()
|
|
23
|
+
agent = context.agent
|
|
24
|
+
return await fetch_evm_account(agent)
|
|
25
|
+
|
|
26
|
+
def get_cdp_network(self) -> str:
|
|
27
|
+
"""Get CDP network mapped from the agent's network id."""
|
|
28
|
+
context = self.get_context()
|
|
29
|
+
agent = context.agent
|
|
30
|
+
return resolve_cdp_network(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:
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"""DALL-E image generation skill for OpenAI."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Type
|
|
5
4
|
|
|
6
5
|
import openai
|
|
7
6
|
from epyxid import XID
|
|
8
7
|
from pydantic import BaseModel, Field
|
|
9
8
|
|
|
9
|
+
from intentkit.clients.s3 import store_image
|
|
10
10
|
from intentkit.skills.openai.base import OpenAIBaseTool
|
|
11
|
-
from intentkit.utils.s3 import store_image
|
|
12
11
|
|
|
13
12
|
logger = logging.getLogger(__name__)
|
|
14
13
|
|
|
@@ -53,7 +52,7 @@ class DALLEImageGeneration(OpenAIBaseTool):
|
|
|
53
52
|
"high-quality images from text descriptions.\n"
|
|
54
53
|
"You can specify size, quality, and style parameters for more control.\n"
|
|
55
54
|
)
|
|
56
|
-
args_schema:
|
|
55
|
+
args_schema: type[BaseModel] = DALLEImageGenerationInput
|
|
57
56
|
|
|
58
57
|
async def _arun(
|
|
59
58
|
self,
|
|
@@ -71,7 +70,6 @@ class DALLEImageGeneration(OpenAIBaseTool):
|
|
|
71
70
|
quality: Quality of the generated image. Options: standard, hd
|
|
72
71
|
style: Style of the generated image. Options: vivid, natural
|
|
73
72
|
|
|
74
|
-
|
|
75
73
|
Returns:
|
|
76
74
|
str: URL of the generated image.
|
|
77
75
|
|
|
@@ -79,12 +77,9 @@ class DALLEImageGeneration(OpenAIBaseTool):
|
|
|
79
77
|
Exception: If the image generation fails.
|
|
80
78
|
"""
|
|
81
79
|
context = self.get_context()
|
|
82
|
-
skill_config = context.agent.skill_config(self.category)
|
|
83
80
|
|
|
84
|
-
# Get the OpenAI API key from
|
|
85
|
-
api_key =
|
|
86
|
-
"openai_api_key"
|
|
87
|
-
)
|
|
81
|
+
# Get the OpenAI API key from configuration or agent settings
|
|
82
|
+
api_key = self.get_api_key()
|
|
88
83
|
|
|
89
84
|
# Generate a unique job ID
|
|
90
85
|
job_id = str(XID())
|