mirror of
https://github.com/ParisNeo/lollms.git
synced 2025-01-20 19:49:25 +00:00
added new text to image tool (diffusers)
This commit is contained in:
parent
3f72d1788e
commit
dad67273b5
@ -315,8 +315,11 @@ class LollmsApplication(LoLLMsCom):
|
||||
trace_exception(ex)
|
||||
self.warning(f"Couldn't load Motion control")
|
||||
|
||||
|
||||
if self.config.active_tti_service == "autosd":
|
||||
|
||||
if self.config.active_tti_service == "diffusers":
|
||||
from lollms.services.diffusers.lollms_diffusers import LollmsDiffusers
|
||||
self.tti = LollmsDiffusers(self)
|
||||
elif self.config.active_tti_service == "autosd":
|
||||
from lollms.services.sd.lollms_sd import LollmsSD
|
||||
self.tti = LollmsSD(self)
|
||||
elif self.config.active_tti_service == "dall-e":
|
||||
@ -410,7 +413,10 @@ class LollmsApplication(LoLLMsCom):
|
||||
trace_exception(ex)
|
||||
self.warning(f"Couldn't load Motion control")
|
||||
|
||||
if self.config.active_tti_service == "autosd":
|
||||
if self.config.active_tti_service == "diffusers":
|
||||
from lollms.services.diffusers.lollms_diffusers import LollmsDiffusers
|
||||
self.tti = LollmsDiffusers(self)
|
||||
elif self.config.active_tti_service == "autosd":
|
||||
from lollms.services.sd.lollms_sd import LollmsSD
|
||||
self.tti = LollmsSD(self)
|
||||
elif self.config.active_tti_service == "dall-e":
|
||||
|
@ -14,7 +14,22 @@ from functools import partial
|
||||
|
||||
def build_image(prompt, antiprompt, width, height, processor:APScript, client:Client):
|
||||
try:
|
||||
if processor.personality.config.active_tti_service=="autosd":
|
||||
if processor.personality.config.active_tti_service=="diffusers":
|
||||
if not processor.personality.app.tti:
|
||||
from lollms.services.diffusers.lollms_diffusers import LollmsDiffusers
|
||||
processor.step_start("Loading ParisNeo's fork of AUTOMATIC1111's stable diffusion service")
|
||||
processor.personality.app.tti = LollmsDiffusers(processor.personality.app, processor.personality.name, max_retries=-1,auto_sd_base_url=processor.personality.config.sd_base_url)
|
||||
processor.personality.app.sd = processor.personality.app.tti
|
||||
processor.step_end("Loading ParisNeo's fork of AUTOMATIC1111's stable diffusion service")
|
||||
file, infos = processor.personality.app.tti.paint(
|
||||
prompt,
|
||||
antiprompt,
|
||||
processor.personality.image_files,
|
||||
width = width,
|
||||
height = height,
|
||||
output_path=client.discussion.discussion_folder
|
||||
)
|
||||
elif processor.personality.config.active_tti_service=="autosd":
|
||||
if not processor.personality.app.tti:
|
||||
from lollms.services.sd.lollms_sd import LollmsSD
|
||||
processor.step_start("Loading ParisNeo's fork of AUTOMATIC1111's stable diffusion service")
|
||||
|
82
lollms/server/endpoints/lollms_diffusers.py
Normal file
82
lollms/server/endpoints/lollms_diffusers.py
Normal file
@ -0,0 +1,82 @@
|
||||
"""
|
||||
project: lollms_webui
|
||||
file: lollms_diffusers.py
|
||||
author: ParisNeo
|
||||
description:
|
||||
This module is for diffusers installation and management
|
||||
|
||||
"""
|
||||
from fastapi import APIRouter, Request
|
||||
from lollms_webui import LOLLMSWebUI
|
||||
from pydantic import BaseModel
|
||||
from starlette.responses import StreamingResponse
|
||||
from lollms.types import MSG_TYPE
|
||||
from lollms.main_config import BaseConfig
|
||||
from lollms.utilities import detect_antiprompt, remove_text_from_string, trace_exception, find_first_available_file_index, add_period, PackageManager
|
||||
from lollms.security import check_access
|
||||
from pathlib import Path
|
||||
from ascii_colors import ASCIIColors
|
||||
import os
|
||||
import platform
|
||||
|
||||
# ----------------------- Defining router and main class ------------------------------
|
||||
|
||||
router = APIRouter()
|
||||
lollmsElfServer:LOLLMSWebUI = LOLLMSWebUI.get_instance()
|
||||
|
||||
class Identification(BaseModel):
|
||||
client_id: str
|
||||
class ModelPost(BaseModel):
|
||||
client_id: str
|
||||
model_url: str
|
||||
# ----------------------- voice ------------------------------
|
||||
|
||||
@router.post("/install_diffusers")
|
||||
# async def your_endpoint(request: Request):
|
||||
# request_data = await request.json()
|
||||
# print(request_data) # Use proper logging in real applications
|
||||
def install_diffusers(data: Identification):
|
||||
check_access(lollmsElfServer, data.client_id)
|
||||
try:
|
||||
if lollmsElfServer.config.headless_server_mode:
|
||||
return {"status":False,"error":"Service installation is blocked when in headless mode for obvious security reasons!"}
|
||||
|
||||
if lollmsElfServer.config.host!="localhost" and lollmsElfServer.config.host!="127.0.0.1":
|
||||
return {"status":False,"error":"Service installation is blocked when the server is exposed outside for very obvious reasons!"}
|
||||
|
||||
lollmsElfServer.ShowBlockingMessage("Installing Diffusers library\nPlease stand by")
|
||||
from lollms.services.diffusers.lollms_diffusers import install_diffusers
|
||||
install_diffusers(lollmsElfServer)
|
||||
ASCIIColors.success("Done")
|
||||
lollmsElfServer.HideBlockingMessage()
|
||||
return {"status":True}
|
||||
except Exception as ex:
|
||||
lollmsElfServer.HideBlockingMessage()
|
||||
lollmsElfServer.InfoMessage(f"It looks like I could not install SD because of this error:\n{ex}\nThis is commonly caused by a previous version that I couldn't delete. PLease remove {lollmsElfServer.lollms_paths.personal_path}/shared/auto_sd manually then try again")
|
||||
return {"status":False, 'error':str(ex)}
|
||||
|
||||
|
||||
@router.post("/upgrade_diffusers")
|
||||
def upgrade_sd(data: Identification):
|
||||
check_access(lollmsElfServer, data.client_id)
|
||||
try:
|
||||
if lollmsElfServer.config.headless_server_mode:
|
||||
return {"status":False,"error":"Service installation is blocked when in headless mode for obvious security reasons!"}
|
||||
|
||||
if lollmsElfServer.config.host!="localhost" and lollmsElfServer.config.host!="127.0.0.1":
|
||||
return {"status":False,"error":"Service installation is blocked when the server is exposed outside for very obvious reasons!"}
|
||||
|
||||
lollmsElfServer.ShowBlockingMessage("Upgrading Diffusers library\nPlease stand by")
|
||||
from lollms.services.diffusers.lollms_diffusers import upgrade_diffusers
|
||||
upgrade_diffusers(lollmsElfServer)
|
||||
ASCIIColors.success("Done")
|
||||
lollmsElfServer.HideBlockingMessage()
|
||||
return {"status":True}
|
||||
except Exception as ex:
|
||||
lollmsElfServer.HideBlockingMessage()
|
||||
lollmsElfServer.InfoMessage(f"It looks like I could not install SD because of this error:\n{ex}\nThis is commonly caused by a previous version that I couldn't delete. PLease remove {lollmsElfServer.lollms_paths.personal_path}/shared/auto_sd manually then try again")
|
||||
return {"status":False, 'error':str(ex)}
|
||||
|
||||
@router.post("/install_diffusers_model")
|
||||
def install_model(data: ModelPost):
|
||||
check_access(lollmsElfServer, data.client_id)
|
172
lollms/services/diffusers/lollms_diffusers.py
Normal file
172
lollms/services/diffusers/lollms_diffusers.py
Normal file
@ -0,0 +1,172 @@
|
||||
# Title LollmsDiffusers
|
||||
# Licence: MIT
|
||||
# Author : Paris Neo
|
||||
# All rights are reserved
|
||||
|
||||
from pathlib import Path
|
||||
import sys
|
||||
from lollms.app import LollmsApplication
|
||||
from lollms.paths import LollmsPaths
|
||||
from lollms.config import TypedConfig, ConfigTemplate, BaseConfig
|
||||
from lollms.utilities import PackageManager, check_and_install_torch
|
||||
import time
|
||||
import io
|
||||
import sys
|
||||
import requests
|
||||
import os
|
||||
import base64
|
||||
import subprocess
|
||||
import time
|
||||
import json
|
||||
import platform
|
||||
from dataclasses import dataclass
|
||||
from PIL import Image, PngImagePlugin
|
||||
from enum import Enum
|
||||
from typing import List, Dict, Any
|
||||
|
||||
from ascii_colors import ASCIIColors, trace_exception
|
||||
from lollms.paths import LollmsPaths
|
||||
from lollms.tti import LollmsTTI
|
||||
from lollms.utilities import git_pull, show_yes_no_dialog, run_script_in_env, create_conda_env
|
||||
import subprocess
|
||||
import shutil
|
||||
from tqdm import tqdm
|
||||
import threading
|
||||
|
||||
|
||||
|
||||
def download_file(url, folder_path, local_filename):
|
||||
# Make sure 'folder_path' exists
|
||||
folder_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with requests.get(url, stream=True) as r:
|
||||
r.raise_for_status()
|
||||
total_size = int(r.headers.get('content-length', 0))
|
||||
progress_bar = tqdm(total=total_size, unit='B', unit_scale=True)
|
||||
with open(folder_path / local_filename, 'wb') as f:
|
||||
for chunk in r.iter_content(chunk_size=8192):
|
||||
f.write(chunk)
|
||||
progress_bar.update(len(chunk))
|
||||
progress_bar.close()
|
||||
|
||||
return local_filename
|
||||
|
||||
def install_model(lollms_app:LollmsApplication, model_url):
|
||||
root_dir = lollms_app.lollms_paths.personal_path
|
||||
shared_folder = root_dir/"shared"
|
||||
diffusers_folder = shared_folder / "diffusers"
|
||||
if not PackageManager.check_package_installed("diffusers"):
|
||||
PackageManager.install_or_update("diffusers")
|
||||
if not PackageManager.check_package_installed("torch"):
|
||||
check_and_install_torch(True)
|
||||
|
||||
import torch
|
||||
from diffusers import PixArtSigmaPipeline
|
||||
|
||||
# You can replace the checkpoint id with "PixArt-alpha/PixArt-Sigma-XL-2-512-MS" too.
|
||||
pipe = PixArtSigmaPipeline.from_pretrained(
|
||||
"PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", torch_dtype=torch.float16
|
||||
)
|
||||
|
||||
|
||||
def install_diffusers(lollms_app:LollmsApplication):
|
||||
root_dir = lollms_app.lollms_paths.personal_path
|
||||
shared_folder = root_dir/"shared"
|
||||
diffusers_folder = shared_folder / "diffusers"
|
||||
if not PackageManager.check_package_installed("diffusers"):
|
||||
PackageManager.install_or_update("diffusers")
|
||||
diffusers_folder.mkdir(exist_ok=True, parents=True)
|
||||
|
||||
|
||||
|
||||
def upgrade_diffusers(lollms_app:LollmsApplication):
|
||||
PackageManager.install_or_update("diffusers")
|
||||
|
||||
|
||||
class LollmsDiffusers(LollmsTTI):
|
||||
has_controlnet = False
|
||||
def __init__(
|
||||
self,
|
||||
app:LollmsApplication,
|
||||
wm = "Artbot",
|
||||
):
|
||||
super().__init__(app)
|
||||
self.ready = False
|
||||
# Get the current directory
|
||||
lollms_paths = app.lollms_paths
|
||||
root_dir = lollms_paths.personal_path
|
||||
|
||||
self.wm = wm
|
||||
|
||||
shared_folder = root_dir/"shared"
|
||||
self.diffusers_folder = shared_folder / "diffusers"
|
||||
self.output_dir = root_dir / "outputs/diffusers"
|
||||
self.models_dir = self.diffusers_folder / "models"
|
||||
self.output_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.models_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
ASCIIColors.red(" _ _ _ _ _ __ __ ")
|
||||
ASCIIColors.red(" | | | | | | (_)/ _|/ _| ")
|
||||
ASCIIColors.red(" | | ___ | | |_ __ ___ ___ __| |_| |_| |_ _ _ ___ ___ _ __ ___ ")
|
||||
ASCIIColors.red(" | | / _ \| | | '_ ` _ \/ __| / _` | | _| _| | | / __|/ _ \ '__/ __| ")
|
||||
ASCIIColors.red(" | |___| (_) | | | | | | | \__ \| (_| | | | | | | |_| \__ \ __/ | \__ \ ")
|
||||
ASCIIColors.red(" |______\___/|_|_|_| |_| |_|___/ \__,_|_|_| |_| \__,_|___/\___|_| |___/ ")
|
||||
ASCIIColors.red(" ______ ")
|
||||
ASCIIColors.red(" |______| ")
|
||||
|
||||
import torch
|
||||
from diffusers import PixArtSigmaPipeline
|
||||
self.model = PixArtSigmaPipeline.from_pretrained(
|
||||
"PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", torch_dtype=torch.float16, cache_dir=self.models_dir
|
||||
)
|
||||
# Enable memory optimizations.
|
||||
self.model.enable_model_cpu_offload()
|
||||
|
||||
@staticmethod
|
||||
def verify(app:LollmsApplication):
|
||||
# Clone repository
|
||||
root_dir = app.lollms_paths.personal_path
|
||||
shared_folder = root_dir/"shared"
|
||||
diffusers_folder = shared_folder / "diffusers"
|
||||
return diffusers_folder.exists()
|
||||
|
||||
def get(app:LollmsApplication):
|
||||
root_dir = app.lollms_paths.personal_path
|
||||
shared_folder = root_dir/"shared"
|
||||
diffusers_folder = shared_folder / "diffusers"
|
||||
diffusers_script_path = diffusers_folder / "lollms_diffusers.py"
|
||||
git_pull(diffusers_folder)
|
||||
|
||||
if diffusers_script_path.exists():
|
||||
ASCIIColors.success("lollms_diffusers found.")
|
||||
ASCIIColors.success("Loading source file...",end="")
|
||||
# use importlib to load the module from the file path
|
||||
from lollms.services.diffusers.lollms_diffusers import LollmsDiffusers
|
||||
ASCIIColors.success("ok")
|
||||
return LollmsDiffusers
|
||||
|
||||
|
||||
def paint(
|
||||
self,
|
||||
diffusers_positive_prompt,
|
||||
diffusers_negative_prompt,
|
||||
files=[],
|
||||
sampler_name="Euler",
|
||||
seed=-1,
|
||||
scale=7.5,
|
||||
steps=20,
|
||||
img2img_denoising_strength=0.9,
|
||||
width=512,
|
||||
height=512,
|
||||
restore_faces=True,
|
||||
output_path=None
|
||||
):
|
||||
|
||||
array = self.model(diffusers_positive_prompt).images[0]
|
||||
image = Image.fromarray(array)
|
||||
|
||||
# Save the image
|
||||
image.save('output_image.png')
|
||||
return None, None
|
||||
|
@ -119,22 +119,6 @@ def upgrade_sd(lollms_app:LollmsApplication):
|
||||
subprocess.run(["git", "clone", "https://github.com/ParisNeo/SD-CN-Animation.git", str(sd_folder/"extensions/SD-CN-Animation")])
|
||||
|
||||
|
||||
|
||||
def upgrade_sd(lollms_app:LollmsApplication):
|
||||
root_dir = lollms_app.lollms_paths.personal_path
|
||||
shared_folder = root_dir/"shared"
|
||||
sd_folder = shared_folder / "auto_sd"
|
||||
if not sd_folder.exists():
|
||||
lollms_app.InfoMessage("Comfyui is not installed, install it first")
|
||||
return
|
||||
|
||||
subprocess.run(["git", "pull", str(sd_folder)])
|
||||
subprocess.run(["git", "pull", str(sd_folder/"extensions/SD-CN-Animation")])
|
||||
ASCIIColors.success("DONE")
|
||||
|
||||
|
||||
|
||||
|
||||
def raw_b64_img(image: Image) -> str:
|
||||
# XXX controlnet only accepts RAW base64 without headers
|
||||
with io.BytesIO() as output_bytes:
|
||||
|
Loading…
Reference in New Issue
Block a user