intentkit 0.6.13.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 +14 -7
- intentkit/abstracts/skill.py +6 -144
- intentkit/abstracts/twitter.py +4 -5
- intentkit/clients/__init__.py +5 -2
- intentkit/clients/cdp.py +101 -141
- intentkit/clients/twitter.py +83 -62
- intentkit/clients/web3.py +29 -0
- intentkit/config/config.py +8 -5
- intentkit/core/agent.py +472 -195
- intentkit/core/asset.py +253 -0
- intentkit/core/chat.py +51 -0
- intentkit/core/client.py +1 -1
- intentkit/core/credit.py +460 -130
- intentkit/core/engine.py +262 -233
- intentkit/core/node.py +15 -16
- intentkit/core/prompt.py +62 -28
- intentkit/core/scheduler.py +92 -0
- intentkit/core/statistics.py +168 -0
- intentkit/models/agent.py +1096 -949
- intentkit/models/agent_data.py +68 -38
- intentkit/models/agent_public.json +98 -0
- intentkit/models/agent_schema.json +54 -439
- intentkit/models/app_setting.py +96 -33
- intentkit/models/chat.py +74 -27
- intentkit/models/conversation.py +8 -8
- intentkit/models/credit.py +362 -74
- intentkit/models/db.py +26 -8
- intentkit/models/db_mig.py +2 -2
- intentkit/models/llm.csv +28 -0
- intentkit/models/llm.py +185 -350
- intentkit/models/redis.py +6 -4
- intentkit/models/skill.py +186 -72
- intentkit/models/skills.csv +174 -0
- intentkit/models/user.py +82 -24
- 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 +248 -85
- 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 +5 -5
- intentkit/skills/casino/README.md +254 -0
- intentkit/skills/casino/__init__.py +86 -0
- intentkit/skills/casino/base.py +17 -0
- intentkit/skills/casino/casino.png +0 -0
- intentkit/skills/casino/deck_draw.py +127 -0
- intentkit/skills/casino/deck_shuffle.py +118 -0
- intentkit/skills/casino/dice_roll.py +100 -0
- intentkit/skills/casino/schema.json +77 -0
- intentkit/skills/casino/utils.py +107 -0
- 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 +11 -25
- 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 +11 -21
- 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/README.md +154 -0
- intentkit/skills/dexscreener/__init__.py +97 -93
- intentkit/skills/dexscreener/base.py +125 -133
- intentkit/skills/dexscreener/get_pair_info.py +158 -0
- intentkit/skills/dexscreener/get_token_pairs.py +165 -0
- intentkit/skills/dexscreener/get_tokens_info.py +212 -0
- intentkit/skills/dexscreener/model/search_token_response.py +80 -82
- intentkit/skills/dexscreener/schema.json +91 -48
- intentkit/skills/dexscreener/search_token.py +182 -321
- intentkit/skills/dexscreener/utils.py +420 -0
- 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 +50 -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/README.md +11 -5
- intentkit/skills/firecrawl/__init__.py +5 -18
- intentkit/skills/firecrawl/base.py +4 -11
- 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 +6 -8
- intentkit/skills/firecrawl/scrape.py +150 -40
- 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 +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/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 +1 -7
- intentkit/skills/lifi/schema.json +17 -8
- intentkit/skills/lifi/token_execute.py +36 -30
- 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 +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 +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 +40 -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 +9 -13
- intentkit/skills/supabase/delete_data.py +5 -6
- intentkit/skills/supabase/fetch_data.py +13 -14
- intentkit/skills/supabase/insert_data.py +5 -6
- intentkit/skills/supabase/invoke_function.py +7 -8
- intentkit/skills/supabase/schema.json +2 -3
- intentkit/skills/supabase/update_data.py +7 -8
- intentkit/skills/supabase/upsert_data.py +5 -6
- 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 +23 -35
- intentkit/skills/twitter/follow_user.py +3 -7
- intentkit/skills/twitter/get_mentions.py +6 -13
- intentkit/skills/twitter/get_timeline.py +5 -13
- intentkit/skills/twitter/get_user_by_username.py +3 -7
- intentkit/skills/twitter/get_user_tweets.py +6 -14
- intentkit/skills/twitter/like_tweet.py +3 -7
- intentkit/skills/twitter/post_tweet.py +23 -12
- intentkit/skills/twitter/reply_tweet.py +21 -12
- intentkit/skills/twitter/retweet.py +3 -7
- intentkit/skills/twitter/schema.json +1 -0
- intentkit/skills/twitter/search_tweets.py +5 -13
- 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 +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/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 +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 +61 -2
- intentkit/skills/xmtp/price.py +18 -13
- intentkit/skills/xmtp/schema.json +69 -71
- intentkit/skills/xmtp/swap.py +22 -25
- intentkit/skills/xmtp/transfer.py +71 -32
- intentkit/utils/chain.py +3 -3
- intentkit/utils/error.py +14 -1
- intentkit/utils/logging.py +2 -4
- intentkit/utils/s3.py +59 -7
- intentkit/utils/schema.py +100 -0
- intentkit/utils/slack_alert.py +7 -8
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/METADATA +14 -16
- intentkit-0.8.17.dist-info/RECORD +466 -0
- intentkit/abstracts/exception.py +0 -9
- intentkit/core/skill.py +0 -200
- 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.6.13.dev2.dist-info/RECORD +0 -409
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/WHEEL +0 -0
- {intentkit-0.6.13.dev2.dist-info → intentkit-0.8.17.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,154 +1,147 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from typing import NotRequired,
|
|
3
|
-
|
|
4
|
-
from intentkit.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
from intentkit.skills.venice_image.
|
|
12
|
-
from intentkit.skills.venice_image.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
from intentkit.skills.venice_image.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
# Cache and return the newly created instance
|
|
151
|
-
_cache[name] = skill_class(
|
|
152
|
-
skill_store=store,
|
|
153
|
-
)
|
|
154
|
-
return _cache[name]
|
|
1
|
+
import logging
|
|
2
|
+
from typing import NotRequired, TypedDict
|
|
3
|
+
|
|
4
|
+
from intentkit.skills.base import (
|
|
5
|
+
SkillConfig,
|
|
6
|
+
SkillState,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
# Import the base tool and all specific model skill classes
|
|
10
|
+
from intentkit.skills.venice_image.base import VeniceImageBaseTool
|
|
11
|
+
from intentkit.skills.venice_image.image_enhance.image_enhance import ImageEnhance
|
|
12
|
+
from intentkit.skills.venice_image.image_generation.image_generation_fluently_xl import (
|
|
13
|
+
ImageGenerationFluentlyXL,
|
|
14
|
+
)
|
|
15
|
+
from intentkit.skills.venice_image.image_generation.image_generation_flux_dev import (
|
|
16
|
+
ImageGenerationFluxDev,
|
|
17
|
+
)
|
|
18
|
+
from intentkit.skills.venice_image.image_generation.image_generation_flux_dev_uncensored import (
|
|
19
|
+
ImageGenerationFluxDevUncensored,
|
|
20
|
+
)
|
|
21
|
+
from intentkit.skills.venice_image.image_generation.image_generation_lustify_sdxl import (
|
|
22
|
+
ImageGenerationLustifySDXL,
|
|
23
|
+
)
|
|
24
|
+
from intentkit.skills.venice_image.image_generation.image_generation_pony_realism import (
|
|
25
|
+
ImageGenerationPonyRealism,
|
|
26
|
+
)
|
|
27
|
+
from intentkit.skills.venice_image.image_generation.image_generation_stable_diffusion_3_5 import (
|
|
28
|
+
ImageGenerationStableDiffusion35,
|
|
29
|
+
)
|
|
30
|
+
from intentkit.skills.venice_image.image_generation.image_generation_venice_sd35 import (
|
|
31
|
+
ImageGenerationVeniceSD35,
|
|
32
|
+
)
|
|
33
|
+
from intentkit.skills.venice_image.image_upscale.image_upscale import ImageUpscale
|
|
34
|
+
from intentkit.skills.venice_image.image_vision.image_vision import ImageVision
|
|
35
|
+
|
|
36
|
+
# Cache skills at the system level, because they are stateless and only depend on the store
|
|
37
|
+
_cache: dict[str, VeniceImageBaseTool] = {}
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Define the expected structure for the 'states' dictionary in the config
|
|
43
|
+
class SkillStates(TypedDict):
|
|
44
|
+
image_upscale: SkillState
|
|
45
|
+
image_enhance: SkillState
|
|
46
|
+
image_vision: SkillState
|
|
47
|
+
image_generation_flux_dev: SkillState
|
|
48
|
+
image_generation_flux_dev_uncensored: SkillState
|
|
49
|
+
image_generation_venice_sd35: SkillState
|
|
50
|
+
image_generation_fluently_xl: SkillState
|
|
51
|
+
image_generation_lustify_sdxl: SkillState
|
|
52
|
+
image_generation_pony_realism: SkillState
|
|
53
|
+
image_generation_stable_diffusion_3_5: SkillState
|
|
54
|
+
# Add new skill names here if more models are added
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# Define the overall configuration structure for the venice_image category
|
|
58
|
+
class Config(SkillConfig):
|
|
59
|
+
"""Configuration for Venice Image skills."""
|
|
60
|
+
|
|
61
|
+
enabled: bool # Keep standard enabled flag
|
|
62
|
+
states: SkillStates
|
|
63
|
+
api_key_provider: str = "agent_owner"
|
|
64
|
+
api_key: NotRequired[str | None] # Explicitly Optional
|
|
65
|
+
safe_mode: NotRequired[bool] # Defaults handled in base or usage
|
|
66
|
+
hide_watermark: NotRequired[bool] # Defaults handled in base or usage
|
|
67
|
+
negative_prompt: NotRequired[str] # Defaults handled in base or usage
|
|
68
|
+
rate_limit_number: NotRequired[int | None] # Explicitly Optional
|
|
69
|
+
rate_limit_minutes: NotRequired[int | None] # Explicitly Optional
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
_SKILL_NAME_TO_CLASS_MAP: dict[str, type[VeniceImageBaseTool]] = {
|
|
73
|
+
"image_upscale": ImageUpscale,
|
|
74
|
+
"image_enhance": ImageEnhance,
|
|
75
|
+
"image_vision": ImageVision,
|
|
76
|
+
"image_generation_flux_dev": ImageGenerationFluxDev,
|
|
77
|
+
"image_generation_flux_dev_uncensored": ImageGenerationFluxDevUncensored,
|
|
78
|
+
"image_generation_venice_sd35": ImageGenerationVeniceSD35,
|
|
79
|
+
"image_generation_fluently_xl": ImageGenerationFluentlyXL,
|
|
80
|
+
"image_generation_lustify_sdxl": ImageGenerationLustifySDXL,
|
|
81
|
+
"image_generation_pony_realism": ImageGenerationPonyRealism,
|
|
82
|
+
"image_generation_stable_diffusion_3_5": ImageGenerationStableDiffusion35,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def get_skills(
|
|
87
|
+
config: "Config",
|
|
88
|
+
is_private: bool,
|
|
89
|
+
**_, # Allow for extra arguments if the loader passes them
|
|
90
|
+
) -> list[VeniceImageBaseTool]:
|
|
91
|
+
"""Get all enabled Venice Image skills based on configuration and privacy level.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
config: The configuration for Venice Image skills.
|
|
95
|
+
is_private: Whether the context is private (e.g., agent owner).
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
A list of instantiated and enabled Venice Image skill objects.
|
|
99
|
+
"""
|
|
100
|
+
# Check if the entire category is disabled first
|
|
101
|
+
if not config.get("enabled", False):
|
|
102
|
+
return []
|
|
103
|
+
|
|
104
|
+
available_skills: list[VeniceImageBaseTool] = []
|
|
105
|
+
|
|
106
|
+
# Include skills based on their state
|
|
107
|
+
for skill_name, state in config["states"].items():
|
|
108
|
+
if state == "disabled":
|
|
109
|
+
continue
|
|
110
|
+
elif state == "public" or (state == "private" and is_private):
|
|
111
|
+
available_skills.append(skill_name)
|
|
112
|
+
|
|
113
|
+
# Get each skill using the cached getter
|
|
114
|
+
result = []
|
|
115
|
+
for name in available_skills:
|
|
116
|
+
skill = get_venice_image_skill(name, config)
|
|
117
|
+
if skill:
|
|
118
|
+
result.append(skill)
|
|
119
|
+
return result
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def get_venice_image_skill(
|
|
123
|
+
name: str,
|
|
124
|
+
config: "Config",
|
|
125
|
+
) -> VeniceImageBaseTool | None:
|
|
126
|
+
"""
|
|
127
|
+
Factory function to get a cached Venice Image skill instance by name.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
name: The name of the skill to get (must match keys in _SKILL_NAME_TO_CLASS_MAP).
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
The requested Venice Image skill instance, or None if the name is unknown.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
# Return from cache immediately if already exists
|
|
137
|
+
if name in _cache:
|
|
138
|
+
return _cache[name]
|
|
139
|
+
|
|
140
|
+
skill_class = _SKILL_NAME_TO_CLASS_MAP.get(name)
|
|
141
|
+
if not skill_class:
|
|
142
|
+
logger.warning(f"Unknown Venice skill: {name}")
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
# Cache and return the newly created instance
|
|
146
|
+
_cache[name] = skill_class()
|
|
147
|
+
return _cache[name]
|
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module encapsulates all interactions with the Venice AI API.
|
|
3
|
-
It provides a function, make_venice_api_request, to make POST requests
|
|
4
|
-
to the API and handles the responses, including error handling,
|
|
5
|
-
content type checking, and image storage via S3. This separation
|
|
6
|
-
of concerns keeps the core skill logic cleaner and easier to maintain.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import hashlib
|
|
10
|
-
import logging
|
|
11
|
-
from typing import Any
|
|
12
|
-
|
|
13
|
-
import httpx
|
|
14
|
-
|
|
15
|
-
from intentkit.utils.s3 import store_image_bytes
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
async def make_venice_api_request(
|
|
21
|
-
api_key: str,
|
|
22
|
-
path: str,
|
|
23
|
-
payload:
|
|
24
|
-
category: str,
|
|
25
|
-
tool_name: str,
|
|
26
|
-
) ->
|
|
27
|
-
"""
|
|
28
|
-
Makes a POST request to the Venice AI API, handling all aspects
|
|
29
|
-
of the API interaction. This includes:
|
|
30
|
-
|
|
31
|
-
1. Constructing the API URL using a base URL and the provided path.
|
|
32
|
-
2. Adding the required authorization header with the provided API key.
|
|
33
|
-
3. Sending the POST request with the given payload.
|
|
34
|
-
4. Handling potential connection and HTTP errors.
|
|
35
|
-
5. Calling the internal _handle_response function to process the API's
|
|
36
|
-
response, which might be JSON or an image.
|
|
37
|
-
|
|
38
|
-
Args:
|
|
39
|
-
api_key: The Venice AI API key for authentication.
|
|
40
|
-
path: The API endpoint path (e.g., "/api/v1/image/generate"). Should *not* start with the base URL.
|
|
41
|
-
payload: The data to send in the request body (as JSON).
|
|
42
|
-
category: The category of the skill making the request (e.g., "venice_image"). Used for S3 storage and logging purpose.
|
|
43
|
-
tool_name: The name of the tool or skill making the request (e.g., "image_generation"). Used for S3 storage and logging purpose.
|
|
44
|
-
|
|
45
|
-
Returns:
|
|
46
|
-
A tuple: (success_data, error_data).
|
|
47
|
-
- success_data: A dictionary containing the parsed JSON response from the API if the request was successful
|
|
48
|
-
(or a dictionary containing the S3 URL if the response is an image).
|
|
49
|
-
- error_data: A dictionary containing information about any errors that occurred,
|
|
50
|
-
or None if the request was successful. The dictionary includes an 'error' key.
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
venice_base_url = "https://api.venice.ai" # Venice AI API base URL
|
|
54
|
-
|
|
55
|
-
if not path.startswith("/"):
|
|
56
|
-
path = "/" + path
|
|
57
|
-
|
|
58
|
-
api_url = f"{venice_base_url}{path}"
|
|
59
|
-
|
|
60
|
-
headers = {
|
|
61
|
-
"Authorization": f"Bearer {api_key}",
|
|
62
|
-
"Content-Type": "application/json",
|
|
63
|
-
"Accept": "image/*, application/json",
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
logger.info(
|
|
67
|
-
f"[{category}/{tool_name}] Sending request to {api_url} with payload: {payload}"
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
try:
|
|
71
|
-
async with httpx.AsyncClient(timeout=180.0) as client:
|
|
72
|
-
response = await client.post(api_url, json=payload, headers=headers)
|
|
73
|
-
return await _handle_response(response, category, tool_name)
|
|
74
|
-
|
|
75
|
-
except httpx.RequestError as e:
|
|
76
|
-
error_msg = f"Connection error: {e}"
|
|
77
|
-
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
78
|
-
return {}, {"success": False, "error": error_msg}
|
|
79
|
-
except Exception as e:
|
|
80
|
-
error_msg = f"Unexpected error: {e}"
|
|
81
|
-
logger.error(f"[{category}/{tool_name}] {error_msg}", exc_info=True)
|
|
82
|
-
return {}, {"success": False, "error": error_msg}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
async def _handle_response(
|
|
86
|
-
response: httpx.Response, category: str, tool_name: str
|
|
87
|
-
) ->
|
|
88
|
-
"""
|
|
89
|
-
Handles the API response, differentiating between JSON and image responses.
|
|
90
|
-
|
|
91
|
-
If the response is an image (based on the 'content-type' header),
|
|
92
|
-
it stores the image in S3 and returns the S3 URL.
|
|
93
|
-
If the response is JSON, it parses the JSON and returns it.
|
|
94
|
-
If any errors occur, it returns an error dictionary.
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
content_type = str(response.headers.get("content-type", "")).lower()
|
|
98
|
-
|
|
99
|
-
if response.status_code == 200 and content_type.startswith("image/"):
|
|
100
|
-
try:
|
|
101
|
-
upscaled_image_bytes = response.content
|
|
102
|
-
image_hash = hashlib.sha256(upscaled_image_bytes).hexdigest()
|
|
103
|
-
file_extension = content_type.split("/")[-1].split("+")[0] or "png"
|
|
104
|
-
|
|
105
|
-
key = f"{category}/{tool_name}/{image_hash}.{file_extension}"
|
|
106
|
-
|
|
107
|
-
logger.info(f"[{category}/{tool_name}] Storing image with key: {key}")
|
|
108
|
-
|
|
109
|
-
stored_url = await store_image_bytes(
|
|
110
|
-
upscaled_image_bytes, key, content_type=content_type
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
return {"success": True, "result": stored_url}, None
|
|
114
|
-
|
|
115
|
-
except Exception as e:
|
|
116
|
-
error_msg = f"Error processing image response: {e}"
|
|
117
|
-
logger.error(f"[{category}/{tool_name}] {error_msg}", exc_info=True)
|
|
118
|
-
return {}, {"success": False, "error": error_msg}
|
|
119
|
-
|
|
120
|
-
elif response.status_code == 200:
|
|
121
|
-
try:
|
|
122
|
-
logger.info(f"[{category}/{tool_name}] Received successful JSON response.")
|
|
123
|
-
return response.json(), None
|
|
124
|
-
except Exception as json_err:
|
|
125
|
-
error_msg = f"Failed to parse JSON response: {json_err} - {response.text}"
|
|
126
|
-
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
127
|
-
return {}, {"success": False, "error": error_msg}
|
|
128
|
-
|
|
129
|
-
else:
|
|
130
|
-
try:
|
|
131
|
-
error_data = response.json()
|
|
132
|
-
error_msg = f"API returned error: {error_data.get('message', error_data.get('detail', response.text))}"
|
|
133
|
-
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
134
|
-
return {}, {"success": False, "error": error_msg}
|
|
135
|
-
except Exception:
|
|
136
|
-
error_msg = f"API returned status code {response.status_code} with text: {response.text}"
|
|
137
|
-
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
138
|
-
return {}, {"success": False, "error": error_msg}
|
|
1
|
+
"""
|
|
2
|
+
This module encapsulates all interactions with the Venice AI API.
|
|
3
|
+
It provides a function, make_venice_api_request, to make POST requests
|
|
4
|
+
to the API and handles the responses, including error handling,
|
|
5
|
+
content type checking, and image storage via S3. This separation
|
|
6
|
+
of concerns keeps the core skill logic cleaner and easier to maintain.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import httpx
|
|
14
|
+
|
|
15
|
+
from intentkit.utils.s3 import store_image_bytes
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def make_venice_api_request(
|
|
21
|
+
api_key: str,
|
|
22
|
+
path: str,
|
|
23
|
+
payload: dict[str, Any],
|
|
24
|
+
category: str,
|
|
25
|
+
tool_name: str,
|
|
26
|
+
) -> tuple[dict[str, Any], dict[str, Any] | None]:
|
|
27
|
+
"""
|
|
28
|
+
Makes a POST request to the Venice AI API, handling all aspects
|
|
29
|
+
of the API interaction. This includes:
|
|
30
|
+
|
|
31
|
+
1. Constructing the API URL using a base URL and the provided path.
|
|
32
|
+
2. Adding the required authorization header with the provided API key.
|
|
33
|
+
3. Sending the POST request with the given payload.
|
|
34
|
+
4. Handling potential connection and HTTP errors.
|
|
35
|
+
5. Calling the internal _handle_response function to process the API's
|
|
36
|
+
response, which might be JSON or an image.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
api_key: The Venice AI API key for authentication.
|
|
40
|
+
path: The API endpoint path (e.g., "/api/v1/image/generate"). Should *not* start with the base URL.
|
|
41
|
+
payload: The data to send in the request body (as JSON).
|
|
42
|
+
category: The category of the skill making the request (e.g., "venice_image"). Used for S3 storage and logging purpose.
|
|
43
|
+
tool_name: The name of the tool or skill making the request (e.g., "image_generation"). Used for S3 storage and logging purpose.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
A tuple: (success_data, error_data).
|
|
47
|
+
- success_data: A dictionary containing the parsed JSON response from the API if the request was successful
|
|
48
|
+
(or a dictionary containing the S3 URL if the response is an image).
|
|
49
|
+
- error_data: A dictionary containing information about any errors that occurred,
|
|
50
|
+
or None if the request was successful. The dictionary includes an 'error' key.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
venice_base_url = "https://api.venice.ai" # Venice AI API base URL
|
|
54
|
+
|
|
55
|
+
if not path.startswith("/"):
|
|
56
|
+
path = "/" + path
|
|
57
|
+
|
|
58
|
+
api_url = f"{venice_base_url}{path}"
|
|
59
|
+
|
|
60
|
+
headers = {
|
|
61
|
+
"Authorization": f"Bearer {api_key}",
|
|
62
|
+
"Content-Type": "application/json",
|
|
63
|
+
"Accept": "image/*, application/json",
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
logger.info(
|
|
67
|
+
f"[{category}/{tool_name}] Sending request to {api_url} with payload: {payload}"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
try:
|
|
71
|
+
async with httpx.AsyncClient(timeout=180.0) as client:
|
|
72
|
+
response = await client.post(api_url, json=payload, headers=headers)
|
|
73
|
+
return await _handle_response(response, category, tool_name)
|
|
74
|
+
|
|
75
|
+
except httpx.RequestError as e:
|
|
76
|
+
error_msg = f"Connection error: {e}"
|
|
77
|
+
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
78
|
+
return {}, {"success": False, "error": error_msg}
|
|
79
|
+
except Exception as e:
|
|
80
|
+
error_msg = f"Unexpected error: {e}"
|
|
81
|
+
logger.error(f"[{category}/{tool_name}] {error_msg}", exc_info=True)
|
|
82
|
+
return {}, {"success": False, "error": error_msg}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
async def _handle_response(
|
|
86
|
+
response: httpx.Response, category: str, tool_name: str
|
|
87
|
+
) -> tuple[dict[str, Any], dict[str, Any] | None]:
|
|
88
|
+
"""
|
|
89
|
+
Handles the API response, differentiating between JSON and image responses.
|
|
90
|
+
|
|
91
|
+
If the response is an image (based on the 'content-type' header),
|
|
92
|
+
it stores the image in S3 and returns the S3 URL.
|
|
93
|
+
If the response is JSON, it parses the JSON and returns it.
|
|
94
|
+
If any errors occur, it returns an error dictionary.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
content_type = str(response.headers.get("content-type", "")).lower()
|
|
98
|
+
|
|
99
|
+
if response.status_code == 200 and content_type.startswith("image/"):
|
|
100
|
+
try:
|
|
101
|
+
upscaled_image_bytes = response.content
|
|
102
|
+
image_hash = hashlib.sha256(upscaled_image_bytes).hexdigest()
|
|
103
|
+
file_extension = content_type.split("/")[-1].split("+")[0] or "png"
|
|
104
|
+
|
|
105
|
+
key = f"{category}/{tool_name}/{image_hash}.{file_extension}"
|
|
106
|
+
|
|
107
|
+
logger.info(f"[{category}/{tool_name}] Storing image with key: {key}")
|
|
108
|
+
|
|
109
|
+
stored_url = await store_image_bytes(
|
|
110
|
+
upscaled_image_bytes, key, content_type=content_type
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
return {"success": True, "result": stored_url}, None
|
|
114
|
+
|
|
115
|
+
except Exception as e:
|
|
116
|
+
error_msg = f"Error processing image response: {e}"
|
|
117
|
+
logger.error(f"[{category}/{tool_name}] {error_msg}", exc_info=True)
|
|
118
|
+
return {}, {"success": False, "error": error_msg}
|
|
119
|
+
|
|
120
|
+
elif response.status_code == 200:
|
|
121
|
+
try:
|
|
122
|
+
logger.info(f"[{category}/{tool_name}] Received successful JSON response.")
|
|
123
|
+
return response.json(), None
|
|
124
|
+
except Exception as json_err:
|
|
125
|
+
error_msg = f"Failed to parse JSON response: {json_err} - {response.text}"
|
|
126
|
+
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
127
|
+
return {}, {"success": False, "error": error_msg}
|
|
128
|
+
|
|
129
|
+
else:
|
|
130
|
+
try:
|
|
131
|
+
error_data = response.json()
|
|
132
|
+
error_msg = f"API returned error: {error_data.get('message', error_data.get('detail', response.text))}"
|
|
133
|
+
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
134
|
+
return {}, {"success": False, "error": error_msg}
|
|
135
|
+
except Exception:
|
|
136
|
+
error_msg = f"API returned status code {response.status_code} with text: {response.text}"
|
|
137
|
+
logger.error(f"[{category}/{tool_name}] {error_msg}")
|
|
138
|
+
return {}, {"success": False, "error": error_msg}
|