diff --git a/.vscode/settings.json b/.vscode/settings.json index d5e8da26c..2b6588ae9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,6 @@ "./repositories/stable-diffusion-stability-ai", "./repositories/stable-diffusion-stability-ai/ldm" ], - "python.analysis.typeCheckingMode": "off" -} + "python.analysis.typeCheckingMode": "off", + "editor.formatOnSave": false +} \ No newline at end of file diff --git a/modules/api/api.py b/modules/api/api.py index 66bce7959..d33a81834 100644 --- a/modules/api/api.py +++ b/modules/api/api.py @@ -13,7 +13,7 @@ import requests import piexif import piexif.helper import gradio as gr -from modules import errors, shared, sd_samplers, deepbooru, sd_hijack, images, scripts, ui, postprocessing +from modules import errors, shared, sd_samplers, deepbooru, sd_hijack, images, scripts, ui, postprocessing, script_callbacks, generation_parameters_copypaste from modules.sd_vae import vae_dict from modules.api import models from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img, process_images @@ -133,7 +133,7 @@ class Api: self.add_api_route("/sdapi/v1/embeddings", self.get_embeddings, methods=["GET"], response_model=models.EmbeddingsResponse) self.add_api_route("/sdapi/v1/refresh-checkpoints", self.refresh_checkpoints, methods=["POST"]) self.add_api_route("/sdapi/v1/sd-vae", self.get_sd_vaes, methods=["GET"], response_model=List[models.SDVaeItem]) - self.add_api_route("/sdapi/v1/refresh-vaes", self.refresh_vaes, methods=["POST"]) + self.add_api_route("/sdapi/v1/refresh-vae", self.refresh_vaes, methods=["POST"]) self.add_api_route("/sdapi/v1/create/embedding", self.create_embedding, methods=["POST"], response_model=models.CreateResponse) self.add_api_route("/sdapi/v1/create/hypernetwork", self.create_hypernetwork, methods=["POST"], response_model=models.CreateResponse) self.add_api_route("/sdapi/v1/preprocess", self.preprocess, methods=["POST"], response_model=models.PreprocessResponse) @@ -145,6 +145,7 @@ class Api: self.add_api_route("/sdapi/v1/reload-checkpoint", self.reloadapi, methods=["POST"]) self.add_api_route("/sdapi/v1/scripts", self.get_scripts_list, methods=["GET"], response_model=models.ScriptsList) self.add_api_route("/sdapi/v1/script-info", self.get_script_info, methods=["GET"], response_model=List[models.ScriptInfo]) + self.add_api_route("/sdapi/v1/extensions", self.get_extensions_list, methods=["GET"], response_model=List[models.ExtensionItem]) self.add_api_route("/sdapi/v1/log", self.get_log_buffer, methods=["GET"], response_model=List) self.add_api_route("/sdapi/v1/start", self.session_start, methods=["GET"]) self.add_api_route("/sdapi/v1/motd", self.get_motd, methods=["GET"], response_model=str) @@ -368,14 +369,22 @@ class Api: def pnginfoapi(self, req: models.PNGInfoRequest): if not req.image.strip(): return models.PNGInfoResponse(info="") + image = decode_base64_to_image(req.image.strip()) if image is None: return models.PNGInfoResponse(info="") + geninfo, items = images.read_info_from_image(image) if geninfo is None: geninfo = "" - items = {**{'parameters': geninfo}, **items} - return models.PNGInfoResponse(info=geninfo, items=items) + + if items and items['parameters']: + del items['parameters'] + + params = generation_parameters_copypaste.parse_generation_parameters(geninfo) + script_callbacks.infotext_pasted_callback(geninfo, params) + + return models.PNGInfoResponse(info=geninfo, items=items, parameters=params) def progressapi(self, req: models.ProgressRequest = Depends()): if shared.state.job_count == 0: @@ -464,7 +473,7 @@ class Api: return [{"name": upscaler.name, "model_name": upscaler.scaler.model_name, "model_path": upscaler.data_path, "model_url": None, "scale": upscaler.scale} for upscaler in shared.sd_upscalers] def get_sd_models(self): - return [{"title": x.title, "name": x.name, "filename": x.filename, "type": x.type, "hash": x.shorthash, "sha256": x.sha256, "config": find_checkpoint_config_near_filename(x)} for x in checkpoints_list.values()] + return [{"title": x.title, "model_name": x.name, "filename": x.filename, "type": x.type, "hash": x.shorthash, "sha256": x.sha256, "config": find_checkpoint_config_near_filename(x)} for x in checkpoints_list.values()] def get_hypernetworks(self): return [{"name": name, "path": shared.hypernetworks[name]} for name in shared.hypernetworks] @@ -640,6 +649,25 @@ class Api: cuda = { 'error': f'{err}' } return models.MemoryResponse(ram = ram, cuda = cuda) + def get_extensions_list(self): + from modules import extensions + extensions.list_extensions() + ext_list = [] + for ext in extensions.extensions: + ext: extensions.Extension + ext.read_info() + if ext.remote is not None: + ext_list.append({ + "name": ext.name, + "remote": ext.remote, + "branch": ext.branch, + "commit_hash":ext.commit_hash, + "commit_date":ext.commit_date, + "version":ext.version, + "enabled":ext.enabled + }) + return ext_list + def launch(self): config = { "listen": shared.cmd_opts.listen, diff --git a/modules/api/models.py b/modules/api/models.py index 3ed73a42e..9d90f0ca7 100644 --- a/modules/api/models.py +++ b/modules/api/models.py @@ -170,7 +170,8 @@ class PNGInfoRequest(BaseModel): class PNGInfoResponse(BaseModel): info: str = Field(title="Image info", description="A string with the parameters used to generate the image") - items: dict = Field(title="Items", description="An object containing all the info the image had") + items: dict = Field(title="Items", description="A dictionary containing all the other fields the image had") + parameters: dict = Field(title="Parameters", description="A dictionary with parsed generation info fields") class LogRequest(BaseModel): lines: int = Field(default=100, title="Lines", description="How many lines to return") @@ -209,7 +210,7 @@ for key, metadata in shared.opts.data_labels.items(): if metadata is not None: fields.update({key: (Optional[optType], Field( - default=metadata.default ,description=metadata.label))}) + default=metadata.default, description=metadata.label))}) else: fields.update({key: (Optional[optType], Field())}) @@ -245,7 +246,7 @@ class UpscalerItem(BaseModel): class SDModelItem(BaseModel): title: str = Field(title="Title") - name: str = Field(title="Model Name") + model_name: str = Field(title="Model Name") filename: str = Field(title="Filename") type: str = Field(title="Model type") sha256: Optional[str] = Field(title="SHA256 hash") @@ -286,7 +287,6 @@ class ExtraNetworkItem(BaseModel): # metadata: Optional[Any] = Field(title="Metadata") # local: Optional[str] = Field(title="Local") - class ArtistItem(BaseModel): name: str = Field(title="Name") score: float = Field(title="Score") @@ -311,7 +311,6 @@ class ScriptsList(BaseModel): txt2img: list = Field(default=None, title="Txt2img", description="Titles of scripts (txt2img)") img2img: list = Field(default=None, title="Img2img", description="Titles of scripts (img2img)") - class ScriptArg(BaseModel): label: str = Field(default=None, title="Label", description="Name of the argument in UI") value: Optional[Any] = Field(default=None, title="Value", description="Default value of the argument") @@ -320,9 +319,17 @@ class ScriptArg(BaseModel): step: Optional[Any] = Field(default=None, title="Minimum", description="Step for changing value of the argumentin UI") choices: Optional[Any] = Field(default=None, title="Choices", description="Possible values for the argument") - class ScriptInfo(BaseModel): name: str = Field(default=None, title="Name", description="Script name") is_alwayson: bool = Field(default=None, title="IsAlwayson", description="Flag specifying whether this script is an alwayson script") is_img2img: bool = Field(default=None, title="IsImg2img", description="Flag specifying whether this script is an img2img script") args: List[ScriptArg] = Field(title="Arguments", description="List of script's arguments") + +class ExtensionItem(BaseModel): + name: str = Field(title="Name", description="Extension name") + remote: str = Field(title="Remote", description="Extension Repository URL") + branch: str = Field(title="Branch", description="Extension Repository Branch") + commit_hash: str = Field(title="Commit Hash", description="Extension Repository Commit Hash") + version: str = Field(title="Version", description="Extension Version") + commit_date: str = Field(title="Commit Date", description="Extension Repository Commit Date") + enabled: bool = Field(title="Enabled", description="Flag specifying whether this extension is enabled")