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,162 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional, Type
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from epyxid import XID
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.heurist.base import HeuristBaseTool
|
|
10
|
+
from intentkit.utils.s3 import store_image
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ImageGenerationArthemyComicsInput(BaseModel):
|
|
16
|
+
"""Input for ImageGenerationArthemyComics tool."""
|
|
17
|
+
|
|
18
|
+
prompt: str = Field(
|
|
19
|
+
description="Text prompt describing the image to generate.",
|
|
20
|
+
)
|
|
21
|
+
neg_prompt: Optional[str] = Field(
|
|
22
|
+
default="(worst quality: 1.4), bad quality, nsfw",
|
|
23
|
+
description="Negative prompt describing what to avoid in the generated image.",
|
|
24
|
+
)
|
|
25
|
+
width: Optional[int] = Field(
|
|
26
|
+
default=1024,
|
|
27
|
+
le=1024,
|
|
28
|
+
description="Width of the generated image.",
|
|
29
|
+
)
|
|
30
|
+
height: Optional[int] = Field(
|
|
31
|
+
default=1024,
|
|
32
|
+
le=1024,
|
|
33
|
+
description="Height of the generated image.",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ImageGenerationArthemyComics(HeuristBaseTool):
|
|
38
|
+
"""Tool for generating comic-style images using Heurist AI's ArthemyComics model.
|
|
39
|
+
|
|
40
|
+
This tool takes a text prompt and uses Heurist's API to generate
|
|
41
|
+
a comic-style image based on the description.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
name: The name of the tool.
|
|
45
|
+
description: A description of what the tool does.
|
|
46
|
+
args_schema: The schema for the tool's input arguments.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str = "heurist_image_generation_arthemy_comics"
|
|
50
|
+
description: str = (
|
|
51
|
+
"Generate comic-style images using Heurist AI's ArthemyComics model.\n"
|
|
52
|
+
"Provide a text prompt describing the comic-style image you want to generate.\n"
|
|
53
|
+
"ArthemyComics specializes in creating vibrant, stylized comic book illustrations.\n"
|
|
54
|
+
"If you have height and width, remember to specify them.\n"
|
|
55
|
+
)
|
|
56
|
+
args_schema: Type[BaseModel] = ImageGenerationArthemyComicsInput
|
|
57
|
+
|
|
58
|
+
async def _arun(
|
|
59
|
+
self,
|
|
60
|
+
prompt: str,
|
|
61
|
+
neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
|
|
62
|
+
width: Optional[int] = 1024,
|
|
63
|
+
height: Optional[int] = 680,
|
|
64
|
+
config: RunnableConfig = None,
|
|
65
|
+
**kwargs,
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Implementation of the tool to generate comic-style images using Heurist AI's ArthemyComics model.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
prompt: Text prompt describing the image to generate.
|
|
71
|
+
neg_prompt: Negative prompt describing what to avoid in the generated image.
|
|
72
|
+
width: Width of the generated image.
|
|
73
|
+
height: Height of the generated image.
|
|
74
|
+
config: Configuration for the runnable.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
str: URL of the generated image.
|
|
78
|
+
"""
|
|
79
|
+
context = self.context_from_config(config)
|
|
80
|
+
skill_config = context.config
|
|
81
|
+
|
|
82
|
+
# Get the Heurist API key from the skill store
|
|
83
|
+
if "api_key" in skill_config and skill_config["api_key"]:
|
|
84
|
+
api_key = skill_config["api_key"]
|
|
85
|
+
if skill_config.get("rate_limit_number") and skill_config.get(
|
|
86
|
+
"rate_limit_minutes"
|
|
87
|
+
):
|
|
88
|
+
await self.user_rate_limit_by_category(
|
|
89
|
+
context.user_id,
|
|
90
|
+
skill_config["rate_limit_number"],
|
|
91
|
+
skill_config["rate_limit_minutes"],
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
api_key = self.skill_store.get_system_config("heurist_api_key")
|
|
95
|
+
await self.user_rate_limit_by_category(context.user_id, 10, 1440)
|
|
96
|
+
|
|
97
|
+
# Generate a unique job ID
|
|
98
|
+
job_id = str(XID())
|
|
99
|
+
|
|
100
|
+
# Prepare the request payload
|
|
101
|
+
payload = {
|
|
102
|
+
"job_id": job_id,
|
|
103
|
+
"model_input": {
|
|
104
|
+
"SD": {
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"neg_prompt": neg_prompt,
|
|
107
|
+
"num_iterations": 25,
|
|
108
|
+
"width": width,
|
|
109
|
+
"height": height,
|
|
110
|
+
"guidance_scale": 5,
|
|
111
|
+
"seed": -1,
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"model_id": "ArthemyComics",
|
|
115
|
+
"deadline": 120,
|
|
116
|
+
"priority": 1,
|
|
117
|
+
}
|
|
118
|
+
logger.debug(f"Heurist API payload: {payload}")
|
|
119
|
+
|
|
120
|
+
headers = {
|
|
121
|
+
"Authorization": f"Bearer {api_key}",
|
|
122
|
+
"Content-Type": "application/json",
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
# Make the API request
|
|
127
|
+
async with httpx.AsyncClient() as client:
|
|
128
|
+
response = await client.post(
|
|
129
|
+
"http://sequencer.heurist.xyz/submit_job",
|
|
130
|
+
json=payload,
|
|
131
|
+
headers=headers,
|
|
132
|
+
timeout=120,
|
|
133
|
+
)
|
|
134
|
+
logger.debug(f"Heurist API response: {response.text}")
|
|
135
|
+
response.raise_for_status()
|
|
136
|
+
|
|
137
|
+
# Store the image URL
|
|
138
|
+
image_url = response.text.strip('"')
|
|
139
|
+
# Generate a key with agent ID as prefix
|
|
140
|
+
image_key = f"{context.agent.id}/heurist/{job_id}"
|
|
141
|
+
# Store the image and get the CDN URL
|
|
142
|
+
stored_url = await store_image(image_url, image_key)
|
|
143
|
+
|
|
144
|
+
# Return the stored image URL
|
|
145
|
+
return stored_url
|
|
146
|
+
|
|
147
|
+
except httpx.HTTPStatusError as e:
|
|
148
|
+
# Extract error details from response
|
|
149
|
+
try:
|
|
150
|
+
error_json = e.response.json()
|
|
151
|
+
error_code = error_json.get("error", "")
|
|
152
|
+
error_message = error_json.get("message", "")
|
|
153
|
+
full_error = f"Heurist API error: Error code: {error_code}, Message: {error_message}"
|
|
154
|
+
except Exception:
|
|
155
|
+
full_error = f"Heurist API error: {e}"
|
|
156
|
+
|
|
157
|
+
logger.error(full_error)
|
|
158
|
+
raise Exception(full_error)
|
|
159
|
+
|
|
160
|
+
except Exception as e:
|
|
161
|
+
logger.error(f"Error generating image with Heurist: {e}")
|
|
162
|
+
raise Exception(f"Error generating image with Heurist: {str(e)}")
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional, Type
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from epyxid import XID
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.heurist.base import HeuristBaseTool
|
|
10
|
+
from intentkit.utils.s3 import store_image
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ImageGenerationArthemyRealInput(BaseModel):
|
|
16
|
+
"""Input for ImageGenerationArthemyReal tool."""
|
|
17
|
+
|
|
18
|
+
prompt: str = Field(
|
|
19
|
+
description="Text prompt describing the image to generate.",
|
|
20
|
+
)
|
|
21
|
+
neg_prompt: Optional[str] = Field(
|
|
22
|
+
default="(worst quality: 1.4), bad quality, nsfw",
|
|
23
|
+
description="Negative prompt describing what to avoid in the generated image.",
|
|
24
|
+
)
|
|
25
|
+
width: Optional[int] = Field(
|
|
26
|
+
default=1024,
|
|
27
|
+
le=1024,
|
|
28
|
+
description="Width of the generated image.",
|
|
29
|
+
)
|
|
30
|
+
height: Optional[int] = Field(
|
|
31
|
+
default=1024,
|
|
32
|
+
le=1024,
|
|
33
|
+
description="Height of the generated image.",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ImageGenerationArthemyReal(HeuristBaseTool):
|
|
38
|
+
"""Tool for generating realistic images using Heurist AI's ArthemyReal model.
|
|
39
|
+
|
|
40
|
+
This tool takes a text prompt and uses Heurist's API to generate
|
|
41
|
+
a realistic image based on the description.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
name: The name of the tool.
|
|
45
|
+
description: A description of what the tool does.
|
|
46
|
+
args_schema: The schema for the tool's input arguments.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str = "heurist_image_generation_arthemy_real"
|
|
50
|
+
description: str = (
|
|
51
|
+
"Generate realistic images using Heurist AI's ArthemyReal model.\n"
|
|
52
|
+
"Provide a text prompt describing the realistic image you want to generate.\n"
|
|
53
|
+
"ArthemyReal specializes in creating photorealistic, lifelike images with fine details.\n"
|
|
54
|
+
"If you have height and width, remember to specify them.\n"
|
|
55
|
+
)
|
|
56
|
+
args_schema: Type[BaseModel] = ImageGenerationArthemyRealInput
|
|
57
|
+
|
|
58
|
+
async def _arun(
|
|
59
|
+
self,
|
|
60
|
+
prompt: str,
|
|
61
|
+
neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
|
|
62
|
+
width: Optional[int] = 1024,
|
|
63
|
+
height: Optional[int] = 680,
|
|
64
|
+
config: RunnableConfig = None,
|
|
65
|
+
**kwargs,
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Implementation of the tool to generate realistic images using Heurist AI's ArthemyReal model.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
prompt: Text prompt describing the image to generate.
|
|
71
|
+
neg_prompt: Negative prompt describing what to avoid in the generated image.
|
|
72
|
+
width: Width of the generated image.
|
|
73
|
+
height: Height of the generated image.
|
|
74
|
+
config: Configuration for the runnable.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
str: URL of the generated image.
|
|
78
|
+
"""
|
|
79
|
+
context = self.context_from_config(config)
|
|
80
|
+
skill_config = context.config
|
|
81
|
+
|
|
82
|
+
# Get the Heurist API key from the skill store
|
|
83
|
+
if "api_key" in skill_config and skill_config["api_key"]:
|
|
84
|
+
api_key = skill_config["api_key"]
|
|
85
|
+
if skill_config.get("rate_limit_number") and skill_config.get(
|
|
86
|
+
"rate_limit_minutes"
|
|
87
|
+
):
|
|
88
|
+
await self.user_rate_limit_by_category(
|
|
89
|
+
context.user_id,
|
|
90
|
+
skill_config["rate_limit_number"],
|
|
91
|
+
skill_config["rate_limit_minutes"],
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
api_key = self.skill_store.get_system_config("heurist_api_key")
|
|
95
|
+
await self.user_rate_limit_by_category(context.user_id, 10, 1440)
|
|
96
|
+
|
|
97
|
+
# Generate a unique job ID
|
|
98
|
+
job_id = str(XID())
|
|
99
|
+
|
|
100
|
+
# Prepare the request payload
|
|
101
|
+
payload = {
|
|
102
|
+
"job_id": job_id,
|
|
103
|
+
"model_input": {
|
|
104
|
+
"SD": {
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"neg_prompt": neg_prompt,
|
|
107
|
+
"num_iterations": 25,
|
|
108
|
+
"width": width,
|
|
109
|
+
"height": height,
|
|
110
|
+
"guidance_scale": 5,
|
|
111
|
+
"seed": -1,
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"model_id": "ArthemyReal",
|
|
115
|
+
"deadline": 120,
|
|
116
|
+
"priority": 1,
|
|
117
|
+
}
|
|
118
|
+
logger.debug(f"Heurist API payload: {payload}")
|
|
119
|
+
|
|
120
|
+
headers = {
|
|
121
|
+
"Authorization": f"Bearer {api_key}",
|
|
122
|
+
"Content-Type": "application/json",
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
# Make the API request
|
|
127
|
+
async with httpx.AsyncClient() as client:
|
|
128
|
+
response = await client.post(
|
|
129
|
+
"http://sequencer.heurist.xyz/submit_job",
|
|
130
|
+
json=payload,
|
|
131
|
+
headers=headers,
|
|
132
|
+
timeout=120,
|
|
133
|
+
)
|
|
134
|
+
logger.debug(f"Heurist API response: {response.text}")
|
|
135
|
+
response.raise_for_status()
|
|
136
|
+
|
|
137
|
+
# Store the image URL
|
|
138
|
+
image_url = response.text.strip('"')
|
|
139
|
+
# Generate a key with agent ID as prefix
|
|
140
|
+
image_key = f"{context.agent.id}/heurist/{job_id}"
|
|
141
|
+
# Store the image and get the CDN URL
|
|
142
|
+
stored_url = await store_image(image_url, image_key)
|
|
143
|
+
|
|
144
|
+
# Return the stored image URL
|
|
145
|
+
return stored_url
|
|
146
|
+
|
|
147
|
+
except httpx.HTTPStatusError as e:
|
|
148
|
+
# Extract error details from response
|
|
149
|
+
try:
|
|
150
|
+
error_json = e.response.json()
|
|
151
|
+
error_code = error_json.get("error", "")
|
|
152
|
+
error_message = error_json.get("message", "")
|
|
153
|
+
full_error = f"Heurist API error: Error code: {error_code}, Message: {error_message}"
|
|
154
|
+
except Exception:
|
|
155
|
+
full_error = f"Heurist API error: {e}"
|
|
156
|
+
|
|
157
|
+
logger.error(full_error)
|
|
158
|
+
raise Exception(full_error)
|
|
159
|
+
|
|
160
|
+
except Exception as e:
|
|
161
|
+
logger.error(f"Error generating image with Heurist: {e}")
|
|
162
|
+
raise Exception(f"Error generating image with Heurist: {str(e)}")
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional, Type
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from epyxid import XID
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.heurist.base import HeuristBaseTool
|
|
10
|
+
from intentkit.utils.s3 import store_image
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ImageGenerationBrainDanceInput(BaseModel):
|
|
16
|
+
"""Input for ImageGenerationBrainDance tool."""
|
|
17
|
+
|
|
18
|
+
prompt: str = Field(
|
|
19
|
+
description="Text prompt describing the image to generate.",
|
|
20
|
+
)
|
|
21
|
+
neg_prompt: Optional[str] = Field(
|
|
22
|
+
default="(worst quality: 1.4), bad quality, nsfw",
|
|
23
|
+
description="Negative prompt describing what to avoid in the generated image.",
|
|
24
|
+
)
|
|
25
|
+
width: Optional[int] = Field(
|
|
26
|
+
default=1024,
|
|
27
|
+
le=1024,
|
|
28
|
+
description="Width of the generated image.",
|
|
29
|
+
)
|
|
30
|
+
height: Optional[int] = Field(
|
|
31
|
+
default=1024,
|
|
32
|
+
le=1024,
|
|
33
|
+
description="Height of the generated image.",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ImageGenerationBrainDance(HeuristBaseTool):
|
|
38
|
+
"""Tool for generating artistic images using Heurist AI's BrainDance model.
|
|
39
|
+
|
|
40
|
+
This tool takes a text prompt and uses Heurist's API to generate
|
|
41
|
+
an artistic image based on the description.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
name: The name of the tool.
|
|
45
|
+
description: A description of what the tool does.
|
|
46
|
+
args_schema: The schema for the tool's input arguments.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str = "heurist_image_generation_braindance"
|
|
50
|
+
description: str = (
|
|
51
|
+
"Generate artistic images using Heurist AI's BrainDance model.\n"
|
|
52
|
+
"Provide a text prompt describing the artistic image you want to generate.\n"
|
|
53
|
+
"BrainDance specializes in creating unique, artistic interpretations with creative flair.\n"
|
|
54
|
+
"If you have height and width, remember to specify them.\n"
|
|
55
|
+
)
|
|
56
|
+
args_schema: Type[BaseModel] = ImageGenerationBrainDanceInput
|
|
57
|
+
|
|
58
|
+
async def _arun(
|
|
59
|
+
self,
|
|
60
|
+
prompt: str,
|
|
61
|
+
neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
|
|
62
|
+
width: Optional[int] = 1024,
|
|
63
|
+
height: Optional[int] = 680,
|
|
64
|
+
config: RunnableConfig = None,
|
|
65
|
+
**kwargs,
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Implementation of the tool to generate artistic images using Heurist AI's BrainDance model.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
prompt: Text prompt describing the image to generate.
|
|
71
|
+
neg_prompt: Negative prompt describing what to avoid in the generated image.
|
|
72
|
+
width: Width of the generated image.
|
|
73
|
+
height: Height of the generated image.
|
|
74
|
+
config: Configuration for the runnable.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
str: URL of the generated image.
|
|
78
|
+
"""
|
|
79
|
+
context = self.context_from_config(config)
|
|
80
|
+
skill_config = context.config
|
|
81
|
+
|
|
82
|
+
# Get the Heurist API key from the skill store
|
|
83
|
+
if "api_key" in skill_config and skill_config["api_key"]:
|
|
84
|
+
api_key = skill_config["api_key"]
|
|
85
|
+
if skill_config.get("rate_limit_number") and skill_config.get(
|
|
86
|
+
"rate_limit_minutes"
|
|
87
|
+
):
|
|
88
|
+
await self.user_rate_limit_by_category(
|
|
89
|
+
context.user_id,
|
|
90
|
+
skill_config["rate_limit_number"],
|
|
91
|
+
skill_config["rate_limit_minutes"],
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
api_key = self.skill_store.get_system_config("heurist_api_key")
|
|
95
|
+
await self.user_rate_limit_by_category(context.user_id, 10, 1440)
|
|
96
|
+
|
|
97
|
+
# Generate a unique job ID
|
|
98
|
+
job_id = str(XID())
|
|
99
|
+
|
|
100
|
+
# Prepare the request payload
|
|
101
|
+
payload = {
|
|
102
|
+
"job_id": job_id,
|
|
103
|
+
"model_input": {
|
|
104
|
+
"SD": {
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"neg_prompt": neg_prompt,
|
|
107
|
+
"num_iterations": 25,
|
|
108
|
+
"width": width,
|
|
109
|
+
"height": height,
|
|
110
|
+
"guidance_scale": 5,
|
|
111
|
+
"seed": -1,
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"model_id": "BrainDance",
|
|
115
|
+
"deadline": 120,
|
|
116
|
+
"priority": 1,
|
|
117
|
+
}
|
|
118
|
+
logger.debug(f"Heurist API payload: {payload}")
|
|
119
|
+
|
|
120
|
+
headers = {
|
|
121
|
+
"Authorization": f"Bearer {api_key}",
|
|
122
|
+
"Content-Type": "application/json",
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
# Make the API request
|
|
127
|
+
async with httpx.AsyncClient() as client:
|
|
128
|
+
response = await client.post(
|
|
129
|
+
"http://sequencer.heurist.xyz/submit_job",
|
|
130
|
+
json=payload,
|
|
131
|
+
headers=headers,
|
|
132
|
+
timeout=120,
|
|
133
|
+
)
|
|
134
|
+
logger.debug(f"Heurist API response: {response.text}")
|
|
135
|
+
response.raise_for_status()
|
|
136
|
+
|
|
137
|
+
# Store the image URL
|
|
138
|
+
image_url = response.text.strip('"')
|
|
139
|
+
# Generate a key with agent ID as prefix
|
|
140
|
+
image_key = f"{context.agent.id}/heurist/{job_id}"
|
|
141
|
+
# Store the image and get the CDN URL
|
|
142
|
+
stored_url = await store_image(image_url, image_key)
|
|
143
|
+
|
|
144
|
+
# Return the stored image URL
|
|
145
|
+
return stored_url
|
|
146
|
+
|
|
147
|
+
except httpx.HTTPStatusError as e:
|
|
148
|
+
# Extract error details from response
|
|
149
|
+
try:
|
|
150
|
+
error_json = e.response.json()
|
|
151
|
+
error_code = error_json.get("error", "")
|
|
152
|
+
error_message = error_json.get("message", "")
|
|
153
|
+
full_error = f"Heurist API error: Error code: {error_code}, Message: {error_message}"
|
|
154
|
+
except Exception:
|
|
155
|
+
full_error = f"Heurist API error: {e}"
|
|
156
|
+
|
|
157
|
+
logger.error(full_error)
|
|
158
|
+
raise Exception(full_error)
|
|
159
|
+
|
|
160
|
+
except Exception as e:
|
|
161
|
+
logger.error(f"Error generating image with Heurist: {e}")
|
|
162
|
+
raise Exception(f"Error generating image with Heurist: {str(e)}")
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Optional, Type
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from epyxid import XID
|
|
6
|
+
from langchain_core.runnables import RunnableConfig
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from intentkit.skills.heurist.base import HeuristBaseTool
|
|
10
|
+
from intentkit.utils.s3 import store_image
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ImageGenerationCyberRealisticXLInput(BaseModel):
|
|
16
|
+
"""Input for ImageGenerationCyberRealisticXL tool."""
|
|
17
|
+
|
|
18
|
+
prompt: str = Field(
|
|
19
|
+
description="Text prompt describing the image to generate.",
|
|
20
|
+
)
|
|
21
|
+
neg_prompt: Optional[str] = Field(
|
|
22
|
+
default="(worst quality: 1.4), bad quality, nsfw",
|
|
23
|
+
description="Negative prompt describing what to avoid in the generated image.",
|
|
24
|
+
)
|
|
25
|
+
width: Optional[int] = Field(
|
|
26
|
+
default=1024,
|
|
27
|
+
le=1024,
|
|
28
|
+
description="Width of the generated image.",
|
|
29
|
+
)
|
|
30
|
+
height: Optional[int] = Field(
|
|
31
|
+
default=680,
|
|
32
|
+
le=1024,
|
|
33
|
+
description="Height of the generated image.",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ImageGenerationCyberRealisticXL(HeuristBaseTool):
|
|
38
|
+
"""Tool for generating hyperrealistic cyberpunk images using Heurist AI's CyberRealisticXL model.
|
|
39
|
+
|
|
40
|
+
This tool takes a text prompt and uses Heurist's API to generate
|
|
41
|
+
a hyperrealistic photograph with a cyberpunk aesthetic based on the description.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
name: The name of the tool.
|
|
45
|
+
description: A description of what the tool does.
|
|
46
|
+
args_schema: The schema for the tool's input arguments.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
name: str = "heurist_image_generation_cyber_realistic_xl"
|
|
50
|
+
description: str = (
|
|
51
|
+
"Generate hyperrealistic cyberpunk photography using Heurist AI's CyberRealisticXL model.\n"
|
|
52
|
+
"Provide a text prompt describing the hyperrealistic cyberpunk image you want to generate.\n"
|
|
53
|
+
"CyberRealisticXL specializes in creating high-quality hyperrealistic photographs with a cyberpunk aesthetic.\n"
|
|
54
|
+
"If you have height and width, remember to specify them.\n"
|
|
55
|
+
)
|
|
56
|
+
args_schema: Type[BaseModel] = ImageGenerationCyberRealisticXLInput
|
|
57
|
+
|
|
58
|
+
async def _arun(
|
|
59
|
+
self,
|
|
60
|
+
prompt: str,
|
|
61
|
+
neg_prompt: Optional[str] = "(worst quality: 1.4), bad quality, nsfw",
|
|
62
|
+
width: Optional[int] = 1024,
|
|
63
|
+
height: Optional[int] = 680,
|
|
64
|
+
config: RunnableConfig = None,
|
|
65
|
+
**kwargs,
|
|
66
|
+
) -> str:
|
|
67
|
+
"""Implementation of the tool to generate hyperrealistic cyberpunk images using Heurist AI's CyberRealisticXL model.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
prompt: Text prompt describing the image to generate.
|
|
71
|
+
neg_prompt: Negative prompt describing what to avoid in the generated image.
|
|
72
|
+
width: Width of the generated image.
|
|
73
|
+
height: Height of the generated image.
|
|
74
|
+
config: Configuration for the runnable.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
str: URL of the generated image.
|
|
78
|
+
"""
|
|
79
|
+
context = self.context_from_config(config)
|
|
80
|
+
skill_config = context.config
|
|
81
|
+
|
|
82
|
+
# Get the Heurist API key from the skill store
|
|
83
|
+
if "api_key" in skill_config and skill_config["api_key"]:
|
|
84
|
+
api_key = skill_config["api_key"]
|
|
85
|
+
if skill_config.get("rate_limit_number") and skill_config.get(
|
|
86
|
+
"rate_limit_minutes"
|
|
87
|
+
):
|
|
88
|
+
await self.user_rate_limit_by_category(
|
|
89
|
+
context.user_id,
|
|
90
|
+
skill_config["rate_limit_number"],
|
|
91
|
+
skill_config["rate_limit_minutes"],
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
api_key = self.skill_store.get_system_config("heurist_api_key")
|
|
95
|
+
await self.user_rate_limit_by_category(context.user_id, 10, 1440)
|
|
96
|
+
|
|
97
|
+
# Generate a unique job ID
|
|
98
|
+
job_id = str(XID())
|
|
99
|
+
|
|
100
|
+
# Prepare the request payload
|
|
101
|
+
payload = {
|
|
102
|
+
"job_id": job_id,
|
|
103
|
+
"model_input": {
|
|
104
|
+
"SD": {
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"neg_prompt": neg_prompt,
|
|
107
|
+
"num_iterations": 25,
|
|
108
|
+
"width": width,
|
|
109
|
+
"height": height,
|
|
110
|
+
"guidance_scale": 5,
|
|
111
|
+
"seed": -1,
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"model_id": "CyberRealisticXL",
|
|
115
|
+
"deadline": 180,
|
|
116
|
+
"priority": 1,
|
|
117
|
+
}
|
|
118
|
+
logger.debug(f"Heurist API payload: {payload}")
|
|
119
|
+
|
|
120
|
+
headers = {
|
|
121
|
+
"Authorization": f"Bearer {api_key}",
|
|
122
|
+
"Content-Type": "application/json",
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
# Make the API request
|
|
127
|
+
async with httpx.AsyncClient() as client:
|
|
128
|
+
response = await client.post(
|
|
129
|
+
"http://sequencer.heurist.xyz/submit_job",
|
|
130
|
+
json=payload,
|
|
131
|
+
headers=headers,
|
|
132
|
+
timeout=120,
|
|
133
|
+
)
|
|
134
|
+
logger.debug(f"Heurist API response: {response.text}")
|
|
135
|
+
response.raise_for_status()
|
|
136
|
+
|
|
137
|
+
# Store the image URL
|
|
138
|
+
image_url = response.text.strip('"')
|
|
139
|
+
# Generate a key with agent ID as prefix
|
|
140
|
+
image_key = f"{context.agent.id}/heurist/{job_id}"
|
|
141
|
+
# Store the image and get the CDN URL
|
|
142
|
+
stored_url = await store_image(image_url, image_key)
|
|
143
|
+
|
|
144
|
+
# Return the stored image URL
|
|
145
|
+
return stored_url
|
|
146
|
+
|
|
147
|
+
except httpx.HTTPStatusError as e:
|
|
148
|
+
# Extract error details from response
|
|
149
|
+
try:
|
|
150
|
+
error_json = e.response.json()
|
|
151
|
+
error_code = error_json.get("error", "")
|
|
152
|
+
error_message = error_json.get("message", "")
|
|
153
|
+
full_error = f"Heurist API error: Error code: {error_code}, Message: {error_message}"
|
|
154
|
+
except Exception:
|
|
155
|
+
full_error = f"Heurist API error: {e}"
|
|
156
|
+
|
|
157
|
+
logger.error(full_error)
|
|
158
|
+
raise Exception(full_error)
|
|
159
|
+
|
|
160
|
+
except Exception as e:
|
|
161
|
+
logger.error(f"Error generating image with Heurist: {e}")
|
|
162
|
+
raise Exception(f"Error generating image with Heurist: {str(e)}")
|