intentkit 0.5.0__py3-none-any.whl → 0.5.2__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 +17 -0
- intentkit/abstracts/__init__.py +0 -0
- intentkit/abstracts/agent.py +60 -0
- intentkit/abstracts/api.py +4 -0
- intentkit/abstracts/engine.py +38 -0
- intentkit/abstracts/exception.py +9 -0
- intentkit/abstracts/graph.py +25 -0
- intentkit/abstracts/skill.py +129 -0
- intentkit/abstracts/twitter.py +54 -0
- intentkit/clients/__init__.py +14 -0
- intentkit/clients/cdp.py +53 -0
- intentkit/clients/twitter.py +445 -0
- intentkit/config/__init__.py +0 -0
- intentkit/config/config.py +164 -0
- intentkit/core/__init__.py +0 -0
- intentkit/core/agent.py +191 -0
- intentkit/core/api.py +40 -0
- intentkit/core/client.py +45 -0
- intentkit/core/credit.py +1767 -0
- intentkit/core/engine.py +1018 -0
- intentkit/core/node.py +223 -0
- intentkit/core/prompt.py +58 -0
- intentkit/core/skill.py +124 -0
- intentkit/models/agent.py +1689 -0
- intentkit/models/agent_data.py +810 -0
- intentkit/models/agent_schema.json +733 -0
- intentkit/models/app_setting.py +156 -0
- intentkit/models/base.py +9 -0
- intentkit/models/chat.py +581 -0
- intentkit/models/conversation.py +286 -0
- intentkit/models/credit.py +1406 -0
- intentkit/models/db.py +120 -0
- intentkit/models/db_mig.py +102 -0
- intentkit/models/generator.py +347 -0
- intentkit/models/llm.py +746 -0
- intentkit/models/redis.py +132 -0
- intentkit/models/skill.py +466 -0
- intentkit/models/user.py +243 -0
- intentkit/skills/__init__.py +12 -0
- intentkit/skills/acolyt/__init__.py +83 -0
- intentkit/skills/acolyt/acolyt.jpg +0 -0
- intentkit/skills/acolyt/ask.py +128 -0
- intentkit/skills/acolyt/base.py +28 -0
- intentkit/skills/acolyt/schema.json +89 -0
- intentkit/skills/aixbt/README.md +71 -0
- intentkit/skills/aixbt/__init__.py +73 -0
- intentkit/skills/aixbt/aixbt.jpg +0 -0
- intentkit/skills/aixbt/base.py +21 -0
- intentkit/skills/aixbt/projects.py +153 -0
- intentkit/skills/aixbt/schema.json +99 -0
- intentkit/skills/allora/__init__.py +83 -0
- intentkit/skills/allora/allora.jpeg +0 -0
- intentkit/skills/allora/base.py +28 -0
- intentkit/skills/allora/price.py +130 -0
- intentkit/skills/allora/schema.json +89 -0
- intentkit/skills/base.py +174 -0
- intentkit/skills/carv/README.md +95 -0
- intentkit/skills/carv/__init__.py +121 -0
- intentkit/skills/carv/base.py +183 -0
- intentkit/skills/carv/carv.webp +0 -0
- intentkit/skills/carv/fetch_news.py +92 -0
- intentkit/skills/carv/onchain_query.py +164 -0
- intentkit/skills/carv/schema.json +137 -0
- intentkit/skills/carv/token_info_and_price.py +110 -0
- intentkit/skills/cdp/__init__.py +137 -0
- intentkit/skills/cdp/base.py +21 -0
- intentkit/skills/cdp/cdp.png +0 -0
- intentkit/skills/cdp/get_balance.py +81 -0
- intentkit/skills/cdp/schema.json +473 -0
- intentkit/skills/chainlist/README.md +38 -0
- intentkit/skills/chainlist/__init__.py +54 -0
- intentkit/skills/chainlist/base.py +21 -0
- intentkit/skills/chainlist/chain_lookup.py +208 -0
- intentkit/skills/chainlist/chainlist.png +0 -0
- intentkit/skills/chainlist/schema.json +47 -0
- intentkit/skills/common/__init__.py +82 -0
- intentkit/skills/common/base.py +21 -0
- intentkit/skills/common/common.jpg +0 -0
- intentkit/skills/common/current_time.py +84 -0
- intentkit/skills/common/schema.json +57 -0
- intentkit/skills/cookiefun/README.md +121 -0
- intentkit/skills/cookiefun/__init__.py +78 -0
- intentkit/skills/cookiefun/base.py +41 -0
- intentkit/skills/cookiefun/constants.py +18 -0
- intentkit/skills/cookiefun/cookiefun.png +0 -0
- intentkit/skills/cookiefun/get_account_details.py +171 -0
- intentkit/skills/cookiefun/get_account_feed.py +282 -0
- intentkit/skills/cookiefun/get_account_smart_followers.py +181 -0
- intentkit/skills/cookiefun/get_sectors.py +128 -0
- intentkit/skills/cookiefun/schema.json +155 -0
- intentkit/skills/cookiefun/search_accounts.py +225 -0
- intentkit/skills/cryptocompare/__init__.py +130 -0
- intentkit/skills/cryptocompare/api.py +159 -0
- intentkit/skills/cryptocompare/base.py +303 -0
- intentkit/skills/cryptocompare/cryptocompare.png +0 -0
- intentkit/skills/cryptocompare/fetch_news.py +96 -0
- intentkit/skills/cryptocompare/fetch_price.py +99 -0
- intentkit/skills/cryptocompare/fetch_top_exchanges.py +113 -0
- intentkit/skills/cryptocompare/fetch_top_market_cap.py +109 -0
- intentkit/skills/cryptocompare/fetch_top_volume.py +108 -0
- intentkit/skills/cryptocompare/fetch_trading_signals.py +107 -0
- intentkit/skills/cryptocompare/schema.json +168 -0
- intentkit/skills/cryptopanic/__init__.py +108 -0
- intentkit/skills/cryptopanic/base.py +51 -0
- intentkit/skills/cryptopanic/cryptopanic.png +0 -0
- intentkit/skills/cryptopanic/fetch_crypto_news.py +153 -0
- intentkit/skills/cryptopanic/fetch_crypto_sentiment.py +136 -0
- intentkit/skills/cryptopanic/schema.json +103 -0
- intentkit/skills/dapplooker/README.md +92 -0
- intentkit/skills/dapplooker/__init__.py +83 -0
- intentkit/skills/dapplooker/base.py +26 -0
- intentkit/skills/dapplooker/dapplooker.jpg +0 -0
- intentkit/skills/dapplooker/dapplooker_token_data.py +476 -0
- intentkit/skills/dapplooker/schema.json +91 -0
- intentkit/skills/defillama/__init__.py +323 -0
- intentkit/skills/defillama/api.py +315 -0
- intentkit/skills/defillama/base.py +135 -0
- intentkit/skills/defillama/coins/__init__.py +0 -0
- intentkit/skills/defillama/coins/fetch_batch_historical_prices.py +116 -0
- intentkit/skills/defillama/coins/fetch_block.py +98 -0
- intentkit/skills/defillama/coins/fetch_current_prices.py +105 -0
- intentkit/skills/defillama/coins/fetch_first_price.py +100 -0
- intentkit/skills/defillama/coins/fetch_historical_prices.py +110 -0
- intentkit/skills/defillama/coins/fetch_price_chart.py +109 -0
- intentkit/skills/defillama/coins/fetch_price_percentage.py +93 -0
- intentkit/skills/defillama/config/__init__.py +0 -0
- intentkit/skills/defillama/config/chains.py +433 -0
- intentkit/skills/defillama/defillama.jpeg +0 -0
- intentkit/skills/defillama/fees/__init__.py +0 -0
- intentkit/skills/defillama/fees/fetch_fees_overview.py +130 -0
- intentkit/skills/defillama/schema.json +383 -0
- intentkit/skills/defillama/stablecoins/__init__.py +0 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_chains.py +100 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_charts.py +129 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoin_prices.py +83 -0
- intentkit/skills/defillama/stablecoins/fetch_stablecoins.py +126 -0
- intentkit/skills/defillama/tests/__init__.py +0 -0
- intentkit/skills/defillama/tests/api_integration.test.py +192 -0
- intentkit/skills/defillama/tests/api_unit.test.py +583 -0
- intentkit/skills/defillama/tvl/__init__.py +0 -0
- intentkit/skills/defillama/tvl/fetch_chain_historical_tvl.py +106 -0
- intentkit/skills/defillama/tvl/fetch_chains.py +107 -0
- intentkit/skills/defillama/tvl/fetch_historical_tvl.py +91 -0
- intentkit/skills/defillama/tvl/fetch_protocol.py +207 -0
- intentkit/skills/defillama/tvl/fetch_protocol_current_tvl.py +93 -0
- intentkit/skills/defillama/tvl/fetch_protocols.py +196 -0
- intentkit/skills/defillama/volumes/__init__.py +0 -0
- intentkit/skills/defillama/volumes/fetch_dex_overview.py +157 -0
- intentkit/skills/defillama/volumes/fetch_dex_summary.py +123 -0
- intentkit/skills/defillama/volumes/fetch_options_overview.py +131 -0
- intentkit/skills/defillama/yields/__init__.py +0 -0
- intentkit/skills/defillama/yields/fetch_pool_chart.py +100 -0
- intentkit/skills/defillama/yields/fetch_pools.py +126 -0
- intentkit/skills/dexscreener/__init__.py +93 -0
- intentkit/skills/dexscreener/base.py +133 -0
- intentkit/skills/dexscreener/dexscreener.png +0 -0
- intentkit/skills/dexscreener/model/__init__.py +0 -0
- intentkit/skills/dexscreener/model/search_token_response.py +82 -0
- intentkit/skills/dexscreener/schema.json +48 -0
- intentkit/skills/dexscreener/search_token.py +321 -0
- intentkit/skills/dune_analytics/__init__.py +103 -0
- intentkit/skills/dune_analytics/base.py +46 -0
- intentkit/skills/dune_analytics/dune.png +0 -0
- intentkit/skills/dune_analytics/fetch_kol_buys.py +128 -0
- intentkit/skills/dune_analytics/fetch_nation_metrics.py +237 -0
- intentkit/skills/dune_analytics/schema.json +99 -0
- intentkit/skills/elfa/README.md +100 -0
- intentkit/skills/elfa/__init__.py +123 -0
- intentkit/skills/elfa/base.py +28 -0
- intentkit/skills/elfa/elfa.jpg +0 -0
- intentkit/skills/elfa/mention.py +504 -0
- intentkit/skills/elfa/schema.json +153 -0
- intentkit/skills/elfa/stats.py +118 -0
- intentkit/skills/elfa/tokens.py +126 -0
- intentkit/skills/enso/README.md +75 -0
- intentkit/skills/enso/__init__.py +114 -0
- intentkit/skills/enso/abi/__init__.py +0 -0
- intentkit/skills/enso/abi/approval.py +279 -0
- intentkit/skills/enso/abi/erc20.py +14 -0
- intentkit/skills/enso/abi/route.py +129 -0
- intentkit/skills/enso/base.py +44 -0
- intentkit/skills/enso/best_yield.py +286 -0
- intentkit/skills/enso/enso.jpg +0 -0
- intentkit/skills/enso/networks.py +105 -0
- intentkit/skills/enso/prices.py +93 -0
- intentkit/skills/enso/route.py +300 -0
- intentkit/skills/enso/schema.json +212 -0
- intentkit/skills/enso/tokens.py +223 -0
- intentkit/skills/enso/wallet.py +381 -0
- intentkit/skills/github/README.md +63 -0
- intentkit/skills/github/__init__.py +54 -0
- intentkit/skills/github/base.py +21 -0
- intentkit/skills/github/github.jpg +0 -0
- intentkit/skills/github/github_search.py +183 -0
- intentkit/skills/github/schema.json +59 -0
- intentkit/skills/heurist/__init__.py +143 -0
- intentkit/skills/heurist/base.py +26 -0
- intentkit/skills/heurist/heurist.png +0 -0
- intentkit/skills/heurist/image_generation_animagine_xl.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_comics.py +162 -0
- intentkit/skills/heurist/image_generation_arthemy_real.py +162 -0
- intentkit/skills/heurist/image_generation_braindance.py +162 -0
- intentkit/skills/heurist/image_generation_cyber_realistic_xl.py +162 -0
- intentkit/skills/heurist/image_generation_flux_1_dev.py +162 -0
- intentkit/skills/heurist/image_generation_sdxl.py +161 -0
- intentkit/skills/heurist/schema.json +196 -0
- intentkit/skills/lifi/README.md +294 -0
- intentkit/skills/lifi/__init__.py +141 -0
- intentkit/skills/lifi/base.py +21 -0
- intentkit/skills/lifi/lifi.png +0 -0
- intentkit/skills/lifi/schema.json +89 -0
- intentkit/skills/lifi/token_execute.py +472 -0
- intentkit/skills/lifi/token_quote.py +190 -0
- intentkit/skills/lifi/utils.py +656 -0
- intentkit/skills/moralis/README.md +490 -0
- intentkit/skills/moralis/__init__.py +110 -0
- intentkit/skills/moralis/api.py +281 -0
- intentkit/skills/moralis/base.py +55 -0
- intentkit/skills/moralis/fetch_chain_portfolio.py +191 -0
- intentkit/skills/moralis/fetch_nft_portfolio.py +284 -0
- intentkit/skills/moralis/fetch_solana_portfolio.py +331 -0
- intentkit/skills/moralis/fetch_wallet_portfolio.py +301 -0
- intentkit/skills/moralis/moralis.png +0 -0
- intentkit/skills/moralis/schema.json +156 -0
- intentkit/skills/moralis/tests/__init__.py +0 -0
- intentkit/skills/moralis/tests/test_wallet.py +511 -0
- intentkit/skills/nation/__init__.py +62 -0
- intentkit/skills/nation/base.py +31 -0
- intentkit/skills/nation/nation.png +0 -0
- intentkit/skills/nation/nft_check.py +106 -0
- intentkit/skills/nation/schema.json +58 -0
- intentkit/skills/openai/__init__.py +107 -0
- intentkit/skills/openai/base.py +32 -0
- intentkit/skills/openai/dalle_image_generation.py +128 -0
- intentkit/skills/openai/gpt_image_generation.py +152 -0
- intentkit/skills/openai/gpt_image_to_image.py +186 -0
- intentkit/skills/openai/image_to_text.py +126 -0
- intentkit/skills/openai/openai.png +0 -0
- intentkit/skills/openai/schema.json +139 -0
- intentkit/skills/portfolio/README.md +55 -0
- intentkit/skills/portfolio/__init__.py +151 -0
- intentkit/skills/portfolio/base.py +107 -0
- intentkit/skills/portfolio/constants.py +9 -0
- intentkit/skills/portfolio/moralis.png +0 -0
- intentkit/skills/portfolio/schema.json +237 -0
- intentkit/skills/portfolio/token_balances.py +155 -0
- intentkit/skills/portfolio/wallet_approvals.py +102 -0
- intentkit/skills/portfolio/wallet_defi_positions.py +80 -0
- intentkit/skills/portfolio/wallet_history.py +155 -0
- intentkit/skills/portfolio/wallet_net_worth.py +112 -0
- intentkit/skills/portfolio/wallet_nfts.py +139 -0
- intentkit/skills/portfolio/wallet_profitability.py +101 -0
- intentkit/skills/portfolio/wallet_profitability_summary.py +91 -0
- intentkit/skills/portfolio/wallet_stats.py +79 -0
- intentkit/skills/portfolio/wallet_swaps.py +147 -0
- intentkit/skills/skills.toml +103 -0
- intentkit/skills/slack/__init__.py +98 -0
- intentkit/skills/slack/base.py +55 -0
- intentkit/skills/slack/get_channel.py +109 -0
- intentkit/skills/slack/get_message.py +136 -0
- intentkit/skills/slack/schedule_message.py +92 -0
- intentkit/skills/slack/schema.json +135 -0
- intentkit/skills/slack/send_message.py +81 -0
- intentkit/skills/slack/slack.jpg +0 -0
- intentkit/skills/system/__init__.py +90 -0
- intentkit/skills/system/base.py +22 -0
- intentkit/skills/system/read_agent_api_key.py +87 -0
- intentkit/skills/system/regenerate_agent_api_key.py +77 -0
- intentkit/skills/system/schema.json +53 -0
- intentkit/skills/system/system.svg +76 -0
- intentkit/skills/tavily/README.md +86 -0
- intentkit/skills/tavily/__init__.py +91 -0
- intentkit/skills/tavily/base.py +27 -0
- intentkit/skills/tavily/schema.json +119 -0
- intentkit/skills/tavily/tavily.jpg +0 -0
- intentkit/skills/tavily/tavily_extract.py +147 -0
- intentkit/skills/tavily/tavily_search.py +139 -0
- intentkit/skills/token/README.md +89 -0
- intentkit/skills/token/__init__.py +107 -0
- intentkit/skills/token/base.py +154 -0
- intentkit/skills/token/constants.py +9 -0
- intentkit/skills/token/erc20_transfers.py +145 -0
- intentkit/skills/token/moralis.png +0 -0
- intentkit/skills/token/schema.json +141 -0
- intentkit/skills/token/token_analytics.py +81 -0
- intentkit/skills/token/token_price.py +132 -0
- intentkit/skills/token/token_search.py +121 -0
- intentkit/skills/twitter/__init__.py +146 -0
- intentkit/skills/twitter/base.py +68 -0
- intentkit/skills/twitter/follow_user.py +69 -0
- intentkit/skills/twitter/get_mentions.py +124 -0
- intentkit/skills/twitter/get_timeline.py +111 -0
- intentkit/skills/twitter/get_user_by_username.py +84 -0
- intentkit/skills/twitter/get_user_tweets.py +123 -0
- intentkit/skills/twitter/like_tweet.py +65 -0
- intentkit/skills/twitter/post_tweet.py +90 -0
- intentkit/skills/twitter/reply_tweet.py +98 -0
- intentkit/skills/twitter/retweet.py +76 -0
- intentkit/skills/twitter/schema.json +258 -0
- intentkit/skills/twitter/search_tweets.py +115 -0
- intentkit/skills/twitter/twitter.png +0 -0
- intentkit/skills/unrealspeech/__init__.py +55 -0
- intentkit/skills/unrealspeech/base.py +21 -0
- intentkit/skills/unrealspeech/schema.json +100 -0
- intentkit/skills/unrealspeech/text_to_speech.py +177 -0
- intentkit/skills/unrealspeech/unrealspeech.jpg +0 -0
- intentkit/skills/venice_audio/__init__.py +106 -0
- intentkit/skills/venice_audio/base.py +119 -0
- intentkit/skills/venice_audio/input.py +41 -0
- intentkit/skills/venice_audio/schema.json +152 -0
- intentkit/skills/venice_audio/venice_audio.py +240 -0
- intentkit/skills/venice_audio/venice_logo.jpg +0 -0
- intentkit/skills/venice_image/README.md +119 -0
- intentkit/skills/venice_image/__init__.py +154 -0
- intentkit/skills/venice_image/api.py +138 -0
- intentkit/skills/venice_image/base.py +188 -0
- intentkit/skills/venice_image/config.py +35 -0
- intentkit/skills/venice_image/image_enhance/README.md +119 -0
- intentkit/skills/venice_image/image_enhance/__init__.py +0 -0
- intentkit/skills/venice_image/image_enhance/image_enhance.py +80 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_base.py +23 -0
- intentkit/skills/venice_image/image_enhance/image_enhance_input.py +40 -0
- intentkit/skills/venice_image/image_generation/README.md +144 -0
- intentkit/skills/venice_image/image_generation/__init__.py +0 -0
- intentkit/skills/venice_image/image_generation/image_generation_base.py +117 -0
- intentkit/skills/venice_image/image_generation/image_generation_fluently_xl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev.py +27 -0
- intentkit/skills/venice_image/image_generation/image_generation_flux_dev_uncensored.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_input.py +158 -0
- intentkit/skills/venice_image/image_generation/image_generation_lustify_sdxl.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_pony_realism.py +26 -0
- intentkit/skills/venice_image/image_generation/image_generation_stable_diffusion_3_5.py +28 -0
- intentkit/skills/venice_image/image_generation/image_generation_venice_sd35.py +28 -0
- intentkit/skills/venice_image/image_upscale/README.md +111 -0
- intentkit/skills/venice_image/image_upscale/__init__.py +0 -0
- intentkit/skills/venice_image/image_upscale/image_upscale.py +90 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_base.py +23 -0
- intentkit/skills/venice_image/image_upscale/image_upscale_input.py +22 -0
- intentkit/skills/venice_image/image_vision/README.md +112 -0
- intentkit/skills/venice_image/image_vision/__init__.py +0 -0
- intentkit/skills/venice_image/image_vision/image_vision.py +100 -0
- intentkit/skills/venice_image/image_vision/image_vision_base.py +17 -0
- intentkit/skills/venice_image/image_vision/image_vision_input.py +9 -0
- intentkit/skills/venice_image/schema.json +267 -0
- intentkit/skills/venice_image/utils.py +78 -0
- intentkit/skills/venice_image/venice_image.jpg +0 -0
- intentkit/skills/web_scraper/README.md +82 -0
- intentkit/skills/web_scraper/__init__.py +92 -0
- intentkit/skills/web_scraper/base.py +21 -0
- intentkit/skills/web_scraper/langchain.png +0 -0
- intentkit/skills/web_scraper/schema.json +115 -0
- intentkit/skills/web_scraper/scrape_and_index.py +327 -0
- intentkit/utils/__init__.py +1 -0
- intentkit/utils/chain.py +436 -0
- intentkit/utils/error.py +134 -0
- intentkit/utils/logging.py +70 -0
- intentkit/utils/middleware.py +61 -0
- intentkit/utils/random.py +16 -0
- intentkit/utils/s3.py +267 -0
- intentkit/utils/slack_alert.py +79 -0
- intentkit/utils/tx.py +37 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/METADATA +1 -1
- intentkit-0.5.2.dist-info/RECORD +365 -0
- intentkit-0.5.0.dist-info/RECORD +0 -4
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/WHEEL +0 -0
- {intentkit-0.5.0.dist-info → intentkit-0.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import hashlib
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Any, Dict, Literal, Optional, Type
|
|
5
|
+
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
# Import the generic base
|
|
10
|
+
from intentkit.skills.base import ToolException
|
|
11
|
+
from intentkit.skills.venice_image.base import VeniceImageBaseTool
|
|
12
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
13
|
+
VeniceImageGenerationInput,
|
|
14
|
+
)
|
|
15
|
+
from intentkit.utils.s3 import store_image_bytes
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class VeniceImageGenerationBaseTool(VeniceImageBaseTool):
|
|
21
|
+
"""
|
|
22
|
+
Base class for Venice AI *Image Generation* tools.
|
|
23
|
+
Inherits from VeniceAIBaseTool and handles specifics of the
|
|
24
|
+
/image/generate endpoint.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# --- Attributes specific to Image Generation ---
|
|
28
|
+
args_schema: Type[BaseModel] = VeniceImageGenerationInput
|
|
29
|
+
|
|
30
|
+
# --- Attributes Subclasses MUST Define ---
|
|
31
|
+
name: str = Field(description="The unique name of the image generation tool/model.")
|
|
32
|
+
description: str = Field(
|
|
33
|
+
description="A description of what the image generation tool/model does."
|
|
34
|
+
)
|
|
35
|
+
model_id: str = Field(
|
|
36
|
+
description="The specific model ID used in the Venice Image API call."
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
async def _arun(
|
|
40
|
+
self,
|
|
41
|
+
prompt: str,
|
|
42
|
+
seed: Optional[int] = None,
|
|
43
|
+
negative_prompt: Optional[str] = None,
|
|
44
|
+
width: Optional[int] = 1024,
|
|
45
|
+
height: Optional[int] = 1024,
|
|
46
|
+
format: Literal["png", "jpeg", "webp"] = "png",
|
|
47
|
+
cfg_scale: Optional[float] = 7.5,
|
|
48
|
+
style_preset: Optional[str] = "Photographic",
|
|
49
|
+
config: RunnableConfig = None,
|
|
50
|
+
**kwargs,
|
|
51
|
+
) -> Dict[str, Any]:
|
|
52
|
+
try:
|
|
53
|
+
context = self.context_from_config(config)
|
|
54
|
+
skillConfig = self.getSkillConfig(context)
|
|
55
|
+
await self.apply_venice_rate_limit(context)
|
|
56
|
+
|
|
57
|
+
final_negative_prompt = negative_prompt or skillConfig.negative_prompt
|
|
58
|
+
|
|
59
|
+
payload = {
|
|
60
|
+
"model": self.model_id,
|
|
61
|
+
"prompt": prompt,
|
|
62
|
+
"width": width,
|
|
63
|
+
"height": height,
|
|
64
|
+
"seed": seed,
|
|
65
|
+
"format": format,
|
|
66
|
+
"steps": 30,
|
|
67
|
+
"safe_mode": skillConfig.safe_mode,
|
|
68
|
+
"hide_watermark": skillConfig.hide_watermark,
|
|
69
|
+
"embed_exif_metadata": skillConfig.embed_exif_metadata,
|
|
70
|
+
"cfg_scale": cfg_scale or 7.0,
|
|
71
|
+
"style_preset": style_preset,
|
|
72
|
+
"negative_prompt": final_negative_prompt,
|
|
73
|
+
"return_binary": False,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Strip out None values
|
|
77
|
+
payload = {k: v for k, v in payload.items() if v is not None}
|
|
78
|
+
|
|
79
|
+
result, error = await self.post("/api/v1/image/generate", payload, context)
|
|
80
|
+
|
|
81
|
+
if error:
|
|
82
|
+
raise ToolException(f"Venice Image Generation API error: {error}")
|
|
83
|
+
|
|
84
|
+
base64_image_string = result.get("images", [None])[0]
|
|
85
|
+
if not base64_image_string:
|
|
86
|
+
raise ToolException("No image data found in Venice Image API response.")
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
image_bytes = base64.b64decode(base64_image_string)
|
|
90
|
+
except Exception as decode_error:
|
|
91
|
+
raise ToolException("Invalid base64 image data.") from decode_error
|
|
92
|
+
|
|
93
|
+
response_format = (
|
|
94
|
+
result.get("request", {}).get("data", {}).get("format", format)
|
|
95
|
+
)
|
|
96
|
+
file_extension = response_format or format
|
|
97
|
+
content_type = f"image/{file_extension}"
|
|
98
|
+
|
|
99
|
+
image_hash = hashlib.sha256(image_bytes).hexdigest()
|
|
100
|
+
key = f"{self.category}/{self.model_id}/{image_hash}.{file_extension}"
|
|
101
|
+
|
|
102
|
+
stored_url = await store_image_bytes(
|
|
103
|
+
image_bytes, key, content_type=content_type
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Cleanup & enrich the response
|
|
107
|
+
result.pop("images", None)
|
|
108
|
+
result["image_url"] = stored_url
|
|
109
|
+
result["image_bytes_sha256"] = image_hash
|
|
110
|
+
|
|
111
|
+
return result
|
|
112
|
+
except ToolException as e:
|
|
113
|
+
raise e
|
|
114
|
+
except Exception as e:
|
|
115
|
+
raise ToolException(
|
|
116
|
+
"An unexpected error occurred during the image generation process."
|
|
117
|
+
) from e
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationFluentlyXL(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using the Fluently-XL model via Venice AI.
|
|
12
|
+
Known for aesthetics, lighting, realism, and correct anatomy.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_fluently_xl"
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using the Fluently-XL model (via Venice AI).\n"
|
|
19
|
+
"Aims for improved aesthetics, lighting, realism, and anatomy. Good for professional-quality images.\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 1500 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 8)."
|
|
23
|
+
)
|
|
24
|
+
model_id: str = "fluently-xl"
|
|
25
|
+
|
|
26
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationFluxDev(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using Venice AI's Flux Dev model.
|
|
12
|
+
Developed by Black Forest Labs, this is a 12 billion parameter rectified flow transformer.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_flux_dev"
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using Venice AI's Flux Dev model (by Black Forest Labs).\n"
|
|
19
|
+
"This 12B parameter model is good for research and innovative art workflows.\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 2048 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 8).\n"
|
|
23
|
+
"Use complies with FLUX.1 [dev] Non-Commercial License."
|
|
24
|
+
)
|
|
25
|
+
model_id: str = "flux-dev"
|
|
26
|
+
|
|
27
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationFluxDevUncensored(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using Venice AI's Flux Dev Uncensored model.
|
|
12
|
+
An uncensored version of the flux-dev model for unrestricted generation.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_flux_dev_uncensored"
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using Venice AI's Flux Dev Uncensored model.\n"
|
|
19
|
+
"This is an uncensored version of flux-dev, suitable for unrestricted content including NSFW.\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 2048 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 8)."
|
|
23
|
+
)
|
|
24
|
+
model_id: str = "flux-dev-uncensored"
|
|
25
|
+
|
|
26
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
from typing import Literal, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field, HttpUrl
|
|
4
|
+
|
|
5
|
+
STYLE_PRESETS = [
|
|
6
|
+
"3D Model",
|
|
7
|
+
"Analog Film",
|
|
8
|
+
"Anime",
|
|
9
|
+
"Cinematic",
|
|
10
|
+
"Comic Book",
|
|
11
|
+
"Craft Clay",
|
|
12
|
+
"Digital Art",
|
|
13
|
+
"Enhance",
|
|
14
|
+
"Fantasy Art",
|
|
15
|
+
"Isometric Style",
|
|
16
|
+
"Line Art",
|
|
17
|
+
"Lowpoly",
|
|
18
|
+
"Neon Punk",
|
|
19
|
+
"Origami",
|
|
20
|
+
"Photographic",
|
|
21
|
+
"Pixel Art",
|
|
22
|
+
"Texture",
|
|
23
|
+
"Advertising",
|
|
24
|
+
"Food Photography",
|
|
25
|
+
"Real Estate",
|
|
26
|
+
"Abstract",
|
|
27
|
+
"Cubist",
|
|
28
|
+
"Graffiti",
|
|
29
|
+
"Hyperrealism",
|
|
30
|
+
"Impressionist",
|
|
31
|
+
"Pointillism",
|
|
32
|
+
"Pop Art",
|
|
33
|
+
"Psychedelic",
|
|
34
|
+
"Renaissance",
|
|
35
|
+
"Steampunk",
|
|
36
|
+
"Surrealist",
|
|
37
|
+
"Typography",
|
|
38
|
+
"Watercolor",
|
|
39
|
+
"Fighting Game",
|
|
40
|
+
"GTA",
|
|
41
|
+
"Super Mario",
|
|
42
|
+
"Minecraft",
|
|
43
|
+
"Pokemon",
|
|
44
|
+
"Retro Arcade",
|
|
45
|
+
"Retro Game",
|
|
46
|
+
"RPG Fantasy Game",
|
|
47
|
+
"Strategy Game",
|
|
48
|
+
"Street Fighter",
|
|
49
|
+
"Legend of Zelda",
|
|
50
|
+
"Architectural",
|
|
51
|
+
"Disco",
|
|
52
|
+
"Dreamscape",
|
|
53
|
+
"Dystopian",
|
|
54
|
+
"Fairy Tale",
|
|
55
|
+
"Gothic",
|
|
56
|
+
"Grunge",
|
|
57
|
+
"Horror",
|
|
58
|
+
"Minimalist",
|
|
59
|
+
"Monochrome",
|
|
60
|
+
"Nautical",
|
|
61
|
+
"Space",
|
|
62
|
+
"Stained Glass",
|
|
63
|
+
"Techwear Fashion",
|
|
64
|
+
"Tribal",
|
|
65
|
+
"Zentangle",
|
|
66
|
+
"Collage",
|
|
67
|
+
"Flat Papercut",
|
|
68
|
+
"Kirigami",
|
|
69
|
+
"Paper Mache",
|
|
70
|
+
"Paper Quilling",
|
|
71
|
+
"Papercut Collage",
|
|
72
|
+
"Papercut Shadow Box",
|
|
73
|
+
"Stacked Papercut",
|
|
74
|
+
"Thick Layered Papercut",
|
|
75
|
+
"Alien",
|
|
76
|
+
"Film Noir",
|
|
77
|
+
"HDR",
|
|
78
|
+
"Long Exposure",
|
|
79
|
+
"Neon Noir",
|
|
80
|
+
"Silhouette",
|
|
81
|
+
"Tilt-Shift",
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
STYLE_PRESETS_DESCRIPTION = (
|
|
85
|
+
"Optional style preset to apply. Available options: "
|
|
86
|
+
+ ", ".join([f"'{s}'" for s in STYLE_PRESETS])
|
|
87
|
+
+ ". Defaults to 'Photographic'."
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class InpaintMask(BaseModel):
|
|
92
|
+
image_prompt: str = Field(
|
|
93
|
+
...,
|
|
94
|
+
description="A text prompt describing the original input image that an image model would use to produce a similar/identical image, including the changed features the user will be inpainting.",
|
|
95
|
+
)
|
|
96
|
+
inferred_object: str = Field(
|
|
97
|
+
..., description="The content being added via inpainting."
|
|
98
|
+
)
|
|
99
|
+
object_target: str = Field(
|
|
100
|
+
..., description="Element(s) in the original image to be inpainted over."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class Inpaint(BaseModel):
|
|
105
|
+
image_url: HttpUrl = Field(
|
|
106
|
+
...,
|
|
107
|
+
description="Image target to inpaint",
|
|
108
|
+
)
|
|
109
|
+
strength: int = Field(
|
|
110
|
+
..., ge=0, le=100, description="Strength of the inpainting (0-100).", example=50
|
|
111
|
+
)
|
|
112
|
+
mask: InpaintMask = Field(..., description="Mask settings for inpainting.")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class VeniceImageGenerationInput(BaseModel):
|
|
116
|
+
"""Model representing input parameters for Venice Image Generation."""
|
|
117
|
+
|
|
118
|
+
prompt: str = Field(
|
|
119
|
+
description="The main text prompt describing what should be included in the generated image."
|
|
120
|
+
)
|
|
121
|
+
seed: Optional[int] = Field(
|
|
122
|
+
default=None,
|
|
123
|
+
description="Random seed value to control image generation randomness. "
|
|
124
|
+
"Use the same seed to reproduce identical results. If not set, a random seed will be used.",
|
|
125
|
+
)
|
|
126
|
+
negative_prompt: Optional[str] = Field(
|
|
127
|
+
default=None,
|
|
128
|
+
description="Text describing what should be excluded from the generated image. "
|
|
129
|
+
"If not provided, the default agent configuration will be used.",
|
|
130
|
+
)
|
|
131
|
+
width: Optional[int] = Field(
|
|
132
|
+
default=1024,
|
|
133
|
+
le=2048,
|
|
134
|
+
description="Width of the generated image in pixels. Maximum allowed is 2048. Default is 1024.",
|
|
135
|
+
)
|
|
136
|
+
height: Optional[int] = Field(
|
|
137
|
+
default=1024,
|
|
138
|
+
le=2048,
|
|
139
|
+
description="Height of the generated image in pixels. Maximum allowed is 2048. Default is 1024.",
|
|
140
|
+
)
|
|
141
|
+
format: Literal["png", "jpeg", "webp"] = Field(
|
|
142
|
+
default="png",
|
|
143
|
+
description="Output image format. Options are 'png', 'jpeg', or 'webp'. Defaults to 'png'.",
|
|
144
|
+
)
|
|
145
|
+
cfg_scale: Optional[float] = Field(
|
|
146
|
+
default=7.5,
|
|
147
|
+
description="Classifier-Free Guidance (CFG) scale controls how closely the image follows the prompt. "
|
|
148
|
+
"Higher values (1-20) result in more adherence. Default is 7.5.",
|
|
149
|
+
)
|
|
150
|
+
style_preset: Optional[str] = Field(
|
|
151
|
+
default="Photographic", description=STYLE_PRESETS_DESCRIPTION
|
|
152
|
+
)
|
|
153
|
+
inpainting: Optional[Inpaint] = Field(
|
|
154
|
+
default=None,
|
|
155
|
+
description="Optional inpainting operation that allows modification of specific objects within an image. "
|
|
156
|
+
"Requires an original image url, a strength value (0-100), and detailed mask instructions "
|
|
157
|
+
"to define which part of the image should be edited and what should replace it.",
|
|
158
|
+
)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationLustifySDXL(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using the Lustify SDXL model via Venice AI.
|
|
12
|
+
A photorealistic SDXL checkpoint primarily focused on NSFW content, but can do SFW.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_lustify_sdxl"
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using the Lustify SDXL model (via Venice AI).\n"
|
|
19
|
+
"A photorealistic SDXL model focused on NSFW scenes, but can generate SFW images (objects, animals, fantasy).\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 1500 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 8)."
|
|
23
|
+
)
|
|
24
|
+
model_id: str = "lustify-sdxl"
|
|
25
|
+
|
|
26
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationPonyRealism(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using the Pony Realism model via Venice AI.
|
|
12
|
+
Focused on high-detail, realistic images, especially anime/character designs. Uses Danbooru tags.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_pony_realism"
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using the Pony Realism model (via Venice AI).\n"
|
|
19
|
+
"Creates high-detail, realistic images, good for anime/character designs. Benefits from Danbooru tags (e.g., 'score_9', 'female'/'male').\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 1500 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 8). Marked as 'most_uncensored'."
|
|
23
|
+
)
|
|
24
|
+
model_id: str = "pony-realism"
|
|
25
|
+
|
|
26
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationStableDiffusion35(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using Venice AI's interface to Stable Diffusion 3.5 Large (alternative ID).
|
|
12
|
+
Developed by Stability AI, using MMDiT architecture. Good for art and design.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_stable_diffusion_3_5" # Different skill name
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using Stability AI's Stable Diffusion 3.5 Large model (alternative ID via Venice AI).\n"
|
|
19
|
+
"Ideal for artworks, design processes, and educational use. Not for factual representations.\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 1500 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 16).\n"
|
|
23
|
+
"Use must comply with Stability AI's Acceptable Use Policy."
|
|
24
|
+
)
|
|
25
|
+
# Use the specific ID provided by Venice
|
|
26
|
+
model_id: str = "stable-diffusion-3.5" # Different model ID
|
|
27
|
+
|
|
28
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from intentkit.skills.venice_image.image_generation.image_generation_base import (
|
|
2
|
+
VeniceImageGenerationBaseTool,
|
|
3
|
+
)
|
|
4
|
+
from intentkit.skills.venice_image.image_generation.image_generation_input import (
|
|
5
|
+
STYLE_PRESETS,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImageGenerationVeniceSD35(VeniceImageGenerationBaseTool):
|
|
10
|
+
"""
|
|
11
|
+
Tool for generating images using Venice AI's interface to Stable Diffusion 3.5 Large.
|
|
12
|
+
Developed by Stability AI, using MMDiT architecture. Good for art and design.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
# --- Model Specific Configuration ---
|
|
16
|
+
name: str = "venice_image_generation_venice_sd35"
|
|
17
|
+
description: str = (
|
|
18
|
+
"Generate images using Stability AI's Stable Diffusion 3.5 Large model (via Venice AI).\n"
|
|
19
|
+
"Ideal for artworks, design processes, and educational use. Not for factual representations.\n"
|
|
20
|
+
"Provide a text prompt describing the image (up to 1500 chars).\n"
|
|
21
|
+
f"Optionally specify a style preset from the list: {', '.join(STYLE_PRESETS)}.\n"
|
|
22
|
+
"Supports dimensions up to 2048x2048 (multiple of 16).\n"
|
|
23
|
+
"Use must comply with Stability AI's Acceptable Use Policy."
|
|
24
|
+
)
|
|
25
|
+
# Use the specific ID provided by Venice, assuming it matches the name
|
|
26
|
+
model_id: str = "venice-sd35"
|
|
27
|
+
|
|
28
|
+
# args_schema and _arun are inherited from VeniceImageGenerationBaseTool
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# image_upscale
|
|
2
|
+
|
|
3
|
+
**Image Upscale** is a sub-tool of the Venice Image suite. It uses Venice AI’s powerful super-resolution models to increase the size and clarity of images by 2x or 4x, making low-resolution images suitable for HD displays, print, or content enhancement. This is not just simple pixel stretching—it uses AI to intelligently recreate additional detail, texture, and smoothness.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What does it do?
|
|
8
|
+
|
|
9
|
+
Given any publicly accessible image URL, the tool fetches the image, applies deep-learning upscaling (super-resolution), and returns a new image URL to the upscaled output. Users can choose between 2x or 4x upscaling depending on needs, and can optionally control how much "realism"/texture is preserved from the original.
|
|
10
|
+
|
|
11
|
+
Key benefits:
|
|
12
|
+
- Consistent color, sharpness, and clarity at higher resolutions
|
|
13
|
+
- AI removes pixelation and can reduce compression artifacts
|
|
14
|
+
- Optional "replication" factor lets you tune how much of the original’s noise/detail is restored
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Input
|
|
19
|
+
|
|
20
|
+
| Field | Type | Description | Required | Default |
|
|
21
|
+
|--------------|------------------|------------------------------------------------------------------------------------------------------|----------|---------|
|
|
22
|
+
| image_url | HttpUrl | Public URL to the image you want to upscale. | Yes | |
|
|
23
|
+
| scale | Literal[2, 4] | The scaling factor (2 for 2x, 4 for 4x enlargement). | Yes | 2 |
|
|
24
|
+
| replication | float (0.1–1.0) | How much to preserve edges, texture, and noise from original (higher = more detail, less smoothing). | No | 0.35 |
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"image_url": "https://example.com/photo.jpg",
|
|
30
|
+
"scale": 4,
|
|
31
|
+
"replication": 0.5
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Output
|
|
38
|
+
|
|
39
|
+
On success, returns a result dictionary containing at least:
|
|
40
|
+
- `success`: true
|
|
41
|
+
- `result`: URL for the upscaled image (typically hosted on S3 or compatible object storage)
|
|
42
|
+
- Additional metadata as needed
|
|
43
|
+
|
|
44
|
+
Example:
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"success": true,
|
|
48
|
+
"result": "https://s3.storage.example/venice_image/image_upscale/1a2b3c....png"
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
On error:
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"success": false,
|
|
56
|
+
"error": "Failed to fetch or validate image from URL: ...",
|
|
57
|
+
"result": null
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Typical Use Cases
|
|
64
|
+
|
|
65
|
+
- **Photo Restoration** – Upscale old, small web images for print or display
|
|
66
|
+
- **Content Creation** – Create HD assets from AI-generated or web-ripped images
|
|
67
|
+
- **Design/Prototyping** – Improve source assets for posters, presentations, or large canvas
|
|
68
|
+
- **Archival** – Enhance legacy digital art or research scans
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Advanced Notes
|
|
73
|
+
|
|
74
|
+
- Works for all common raster formats (JPG, PNG, WEBP). Unsupported types are auto-converted to PNG.
|
|
75
|
+
- "Replication" factor explanation:
|
|
76
|
+
- **Low values (e.g., 0.1–0.25):** smoother, less noise, more “plastic” look (good for AI/clean results)
|
|
77
|
+
- **High values (e.g., 0.7–1.0):** preserves original photo noise/texture, less smoothing (good for art/photo upscaling)
|
|
78
|
+
- Original aspect ratio is always preserved.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Limitations
|
|
83
|
+
|
|
84
|
+
- Does not add content—only increases fidelity of existing features.
|
|
85
|
+
- Output detail is limited by source image quality and AI model limits.
|
|
86
|
+
- NSFW images will be blurred if safe mode is enabled.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Example Usage (Pseudo-code)
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
result = await agent.send_tool(
|
|
94
|
+
"image_upscale",
|
|
95
|
+
{
|
|
96
|
+
"image_url": "https://somehost.com/image.png",
|
|
97
|
+
"scale": 2,
|
|
98
|
+
"replication": 0.4
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
upscaled_url = result["result"]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Compliance & Attribution
|
|
107
|
+
|
|
108
|
+
- You must have rights to use the supplied image.
|
|
109
|
+
- Follows [Venice AI terms of service](https://venice.ai/).
|
|
110
|
+
|
|
111
|
+
---
|
|
File without changes
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Literal, Optional
|
|
3
|
+
|
|
4
|
+
from langchain_core.runnables import RunnableConfig
|
|
5
|
+
from pydantic import HttpUrl
|
|
6
|
+
|
|
7
|
+
from intentkit.skills.base import ToolException
|
|
8
|
+
from intentkit.skills.venice_image.image_upscale.image_upscale_base import (
|
|
9
|
+
VeniceImageUpscaleBaseTool,
|
|
10
|
+
)
|
|
11
|
+
from intentkit.skills.venice_image.utils import fetch_image_as_base64
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ImageUpscale(VeniceImageUpscaleBaseTool):
|
|
17
|
+
"""
|
|
18
|
+
Upscales an existing image provided via URL by a factor of 2 or 4 using the Venice AI API.
|
|
19
|
+
Ideal for enhancing the resolution of previously generated or existing images.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
# --- Tool Specific Configuration ---
|
|
23
|
+
name: str = "venice_image_upscale"
|
|
24
|
+
description: str = (
|
|
25
|
+
"Upscales an existing image from a URL using Venice AI.\n"
|
|
26
|
+
"Provide the public URL of the image to upscale.\n"
|
|
27
|
+
"Specify the desired scale factor: 2 (for 2x upscale) or 4 (for 4x upscale).\n"
|
|
28
|
+
"Returns the URL of the upscaled image."
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
# No model_id needed for the generic upscale endpoint currently
|
|
32
|
+
async def _arun(
|
|
33
|
+
self,
|
|
34
|
+
image_url: HttpUrl,
|
|
35
|
+
scale: Literal[2, 4],
|
|
36
|
+
replication: Optional[float] = 0.35,
|
|
37
|
+
config: RunnableConfig = None,
|
|
38
|
+
**kwargs,
|
|
39
|
+
) -> dict:
|
|
40
|
+
"""
|
|
41
|
+
Asynchronously upscales an image from the provided URL using the Venice AI API.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
image_url (HttpUrl): The public URL of the image to upscale.
|
|
45
|
+
scale (Literal[2, 4]): The scale factor for upscaling (2x or 4x).
|
|
46
|
+
replication (Optional[float]): The replication factor for the upscale process, defaults to 0.35.
|
|
47
|
+
config (RunnableConfig, optional): Configuration for the runnable, if any.
|
|
48
|
+
**kwargs: Additional keyword arguments.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
dict: The API response containing the URL of the upscaled image.
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
ToolException: If the image cannot be fetched, validated, or upscaled, or if an API error occurs.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
context = self.context_from_config(config)
|
|
59
|
+
|
|
60
|
+
await self.apply_venice_rate_limit(context)
|
|
61
|
+
|
|
62
|
+
image_base64 = await fetch_image_as_base64(image_url)
|
|
63
|
+
if not image_base64:
|
|
64
|
+
error_msg = f"Failed to fetch or validate image from URL: {image_url}"
|
|
65
|
+
logger.error(error_msg)
|
|
66
|
+
raise ToolException(
|
|
67
|
+
str({"success": False, "error": error_msg, "result": None})
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
payload = {
|
|
71
|
+
"image": image_base64,
|
|
72
|
+
"scale": scale,
|
|
73
|
+
"replication": replication,
|
|
74
|
+
}
|
|
75
|
+
result, error = await self.post("api/v1/image/upscale", payload, context)
|
|
76
|
+
if error:
|
|
77
|
+
raise ToolException(f"Venice Image Upscale API error: {error}")
|
|
78
|
+
return result
|
|
79
|
+
except ToolException as e:
|
|
80
|
+
raise e
|
|
81
|
+
except Exception as e:
|
|
82
|
+
logger.error(f"Error in {self.name}: {str(e)}")
|
|
83
|
+
raise ToolException(
|
|
84
|
+
str(
|
|
85
|
+
{
|
|
86
|
+
"success": False,
|
|
87
|
+
"error": f"An unexpected error occurred: {str(e)}",
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
)
|