diff --git a/README.md b/README.md index e6a16dd..d78aab9 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ You can add `-e PIP_INDEX_URL={pypi-mirror-url}` to docker run command to change - `--sync-repo SYNC_REPO` Sync dependent git repositories to local, 'skip' for skip sync action, 'only' for only do the sync action and not launch app - `--skip-pip` Skip automatic pip install when setup - `--preload-pipeline` Preload pipeline before start http server -- `--queue-size QUEUE_SIZE` Working queue size, default: 3, generation requests exceeding working queue size will return failure +- `--queue-size QUEUE_SIZE` Working queue size, default: 100, generation requests exceeding working queue size will return failure - `--queue-history QUEUE_HISTORY` Finished jobs reserve size, tasks exceeding the limit will be deleted, including output image files, default: 0, means no limit - `--webhook-url WEBHOOK_URL` Webhook url for notify generation result, default: None - `--persistent` Store history to db diff --git a/README_zh.md b/README_zh.md index 46f6b67..588ccb6 100644 --- a/README_zh.md +++ b/README_zh.md @@ -177,7 +177,7 @@ docker run -d --gpus=all \ - `--sync-repo SYNC_REPO` 同步 Fooocus 仓库到本地,`skip` 用于在启动时跳过同步,`only` 只同步不启动程序 - `--skip-pip` 跳过启动时的 pip 安装 - `--preload-pipeline` 启动 http server 之前加载 pipeline -- `--queue-size QUEUE_SIZE` 工作队列大小,默认是 3 ,超过队列的请求会返回失败 +- `--queue-size QUEUE_SIZE` 工作队列大小,默认是 100 ,超过队列的请求会返回失败 - `--queue-history QUEUE_HISTORY` 保留的作业历史,默认 0 即无限制,超过会被删除,包括生成的图像 - `--webhook-url WEBHOOK_URL` 通知生成结果的 webhook 地址,默认为 None - `--persistent` 持久化历史记录到SQLite数据库,默认关闭 diff --git a/docs/api_doc_en.md b/docs/api_doc_en.md index 404ce52..80ee129 100644 --- a/docs/api_doc_en.md +++ b/docs/api_doc_en.md @@ -193,8 +193,8 @@ print(json.dumps(result, indent=4, ensure_ascii=False)) **base info:** ```yaml -EndPoint_V1: /v1/generation/image-inpait-outpaint -EndPoint_V2: /v2/generation/image-inpait-outpaint +EndPoint_V1: /v1/generation/image-inpaint-outpaint +EndPoint_V2: /v2/generation/image-inpaint-outpaint Method: Post DataType: form|json ``` @@ -232,7 +232,7 @@ def inpaint_outpaint(params: dict, input_image: bytes, input_mask: bytes = None) """ example for inpaint outpaint v1 """ - response = requests.post(url=f"{host}/v1/generation/image-inpait-outpaint", + response = requests.post(url=f"{host}/v1/generation/image-inpaint-outpaint", data=params, files={"input_image": input_image, "input_mask": input_mask}) @@ -287,7 +287,7 @@ def inpaint_outpaint(params: dict) -> dict: """ example for inpaint outpaint v2 """ - response = requests.post(url=f"{host}/v2/generation/image-inpait-outpaint", + response = requests.post(url=f"{host}/v2/generation/image-inpaint-outpaint", data=json.dumps(params), headers={"Content-Type": "application/json"}) return response.json() diff --git a/docs/api_doc_zh.md b/docs/api_doc_zh.md index c74265c..6aa9e66 100644 --- a/docs/api_doc_zh.md +++ b/docs/api_doc_zh.md @@ -193,8 +193,8 @@ print(json.dumps(result, indent=4, ensure_ascii=False)) **基础信息:** ```yaml -EndPoint_V1: /v1/generation/image-inpait-outpaint -EndPoint_V2: /v2/generation/image-inpait-outpaint +EndPoint_V1: /v1/generation/image-inpaint-outpaint +EndPoint_V2: /v2/generation/image-inpaint-outpaint Method: Post DataType: form|json ``` @@ -232,7 +232,7 @@ def inpaint_outpaint(params: dict, input_image: bytes, input_mask: bytes = None) """ 局部重绘 v1 接口示例 """ - response = requests.post(url=f"{host}/v1/generation/image-inpait-outpaint", + response = requests.post(url=f"{host}/v1/generation/image-inpaint-outpaint", data=params, files={"input_image": input_image, "input_mask": input_mask}) @@ -287,7 +287,7 @@ def inpaint_outpaint(params: dict) -> dict: """ 局部重绘 v1 接口示例 """ - response = requests.post(url=f"{host}/v2/generation/image-inpait-outpaint", + response = requests.post(url=f"{host}/v2/generation/image-inpaint-outpaint", data=json.dumps(params), headers={"Content-Type": "application/json"}) return response.json() diff --git a/docs/openapi.json b/docs/openapi.json index 55f0472..45862fb 100755 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ping":{"get":{"summary":"Ping","description":"Returns a simple 'pong' response","operationId":"ping_ping_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/generation/text-to-image":{"post":{"summary":"Text2Img Generation","operationId":"text2img_generation_v1_generation_text_to_image_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2ImgRequest"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Text2Img Generation V1 Generation Text To Image Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/text-to-image-with-ip":{"post":{"summary":"Text To Img With Ip","operationId":"text_to_img_with_ip_v2_generation_text_to_image_with_ip_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2ImgRequestWithPrompt"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Text To Img With Ip V2 Generation Text To Image With Ip Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary","operationId":"img_upscale_or_vary_v1_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V1 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary V2","operationId":"img_upscale_or_vary_v2_v2_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgUpscaleOrVaryRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V2 V2 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-inpait-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint","operationId":"img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V1 Generation Image Inpait Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-inpait-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint V2","operationId":"img_inpaint_or_outpaint_v2_v2_generation_image_inpait_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgInpaintOrOutpaintRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V2 V2 Generation Image Inpait Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v1_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_img_prompt_v1_generation_image_prompt_post"}],"title":"Body"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V1 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v2_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgPromptRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V2 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/query-job":{"get":{"summary":"Query Job","description":"Query async generation job","operationId":"query_job_v1_generation_query_job_get","parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"require_step_preivew","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Require Step Preivew"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/job-queue":{"get":{"summary":"Job Queue","description":"Query job queue info","operationId":"job_queue_v1_generation_job_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobQueueInfo"}}}}}}},"/v1/generation/job-history":{"get":{"summary":"Get History","description":"Query historical job data","operationId":"get_history_v1_generation_job_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobHistoryResponse"}}}}}}},"/v1/generation/stop":{"post":{"summary":"Stop","description":"Job stoping","operationId":"stop_v1_generation_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopResponse"}}}}}}},"/v1/tools/describe-image":{"post":{"summary":"Describe Image","operationId":"describe_image_v1_tools_describe_image_post","parameters":[{"name":"type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/DescribeImageType"}],"description":"Image type, 'Photo' or 'Anime'","default":"Photo","title":"Type"},"description":"Image type, 'Photo' or 'Anime'"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_describe_image_v1_tools_describe_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DescribeImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/engines/all-models":{"get":{"summary":"All Models","description":"Get all filenames of base model and lora","operationId":"all_models_v1_engines_all_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/refresh-models":{"post":{"summary":"Refresh Models","description":"Refresh local files and get all filenames of base model and lora","operationId":"refresh_models_v1_engines_refresh_models_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/styles":{"get":{"summary":"All Styles","description":"Get all legal Fooocus styles","operationId":"all_styles_v1_engines_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response All Styles V1 Engines Styles Get"}}}}}}}},"components":{"schemas":{"AdvancedParams":{"properties":{"disable_preview":{"type":"boolean","title":"Disable Preview","description":"Disable preview during generation","default":false},"adm_scaler_positive":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Positive","description":"Positive ADM Guidance Scaler","default":1.5},"adm_scaler_negative":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Negative","description":"Negative ADM Guidance Scaler","default":0.8},"adm_scaler_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Adm Scaler End","description":"ADM Guidance End At Step","default":0.3},"refiner_swap_method":{"type":"string","title":"Refiner Swap Method","description":"Refiner swap method","default":"joint"},"adaptive_cfg":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Adaptive Cfg","description":"CFG Mimicking from TSNR","default":7.0},"sampler_name":{"type":"string","title":"Sampler Name","description":"Sampler","default":"dpmpp_2m_sde_gpu"},"scheduler_name":{"type":"string","title":"Scheduler Name","description":"Scheduler","default":"karras"},"overwrite_step":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Step","description":"Forced Overwrite of Sampling Step","default":-1},"overwrite_switch":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Switch","description":"Forced Overwrite of Refiner Switch Step","default":-1},"overwrite_width":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Width","description":"Forced Overwrite of Generating Width","default":-1},"overwrite_height":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Height","description":"Forced Overwrite of Generating Height","default":-1},"overwrite_vary_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Vary Strength","description":"Forced Overwrite of Denoising Strength of \"Vary\"","default":-1},"overwrite_upscale_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Upscale Strength","description":"Forced Overwrite of Denoising Strength of \"Upscale\"","default":-1},"mixing_image_prompt_and_vary_upscale":{"type":"boolean","title":"Mixing Image Prompt And Vary Upscale","description":"Mixing Image Prompt and Vary/Upscale","default":false},"mixing_image_prompt_and_inpaint":{"type":"boolean","title":"Mixing Image Prompt And Inpaint","description":"Mixing Image Prompt and Inpaint","default":false},"debugging_cn_preprocessor":{"type":"boolean","title":"Debugging Cn Preprocessor","description":"Debug Preprocessors","default":false},"skipping_cn_preprocessor":{"type":"boolean","title":"Skipping Cn Preprocessor","description":"Skip Preprocessors","default":false},"controlnet_softness":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Controlnet Softness","description":"Softness of ControlNet","default":0.25},"canny_low_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny Low Threshold","description":"Canny Low Threshold","default":64},"canny_high_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny High Threshold","description":"Canny High Threshold","default":128},"freeu_enabled":{"type":"boolean","title":"Freeu Enabled","description":"FreeU enabled","default":false},"freeu_b1":{"type":"number","title":"Freeu B1","description":"FreeU B1","default":1.01},"freeu_b2":{"type":"number","title":"Freeu B2","description":"FreeU B2","default":1.02},"freeu_s1":{"type":"number","title":"Freeu S1","description":"FreeU B3","default":0.99},"freeu_s2":{"type":"number","title":"Freeu S2","description":"FreeU B4","default":0.95},"debugging_inpaint_preprocessor":{"type":"boolean","title":"Debugging Inpaint Preprocessor","description":"Debug Inpaint Preprocessing","default":false},"inpaint_disable_initial_latent":{"type":"boolean","title":"Inpaint Disable Initial Latent","description":"Disable initial latent in inpaint","default":false},"inpaint_engine":{"type":"string","title":"Inpaint Engine","description":"Inpaint Engine","default":"v1"},"inpaint_strength":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Strength","description":"Inpaint Denoising Strength","default":1.0},"inpaint_respective_field":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Respective Field","description":"Inpaint Respective Field","default":1.0},"invert_mask_checkbox":{"type":"boolean","title":"Invert Mask Checkbox","description":"Invert Mask","default":false},"inpaint_erode_or_dilate":{"type":"integer","maximum":64.0,"minimum":-64.0,"title":"Inpaint Erode Or Dilate","description":"Mask Erode or Dilate","default":0}},"type":"object","title":"AdvancedParams"},"AllModelNamesResponse":{"properties":{"model_filenames":{"items":{"type":"string"},"type":"array","title":"Model Filenames","description":"All available model filenames"},"lora_filenames":{"items":{"type":"string"},"type":"array","title":"Lora Filenames","description":"All available lora filenames"}},"type":"object","required":["model_filenames","lora_filenames"],"title":"AllModelNamesResponse"},"AsyncJobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Job ID"},"job_type":{"allOf":[{"$ref":"#/components/schemas/TaskType"}],"description":"Job type"},"job_stage":{"allOf":[{"$ref":"#/components/schemas/AsyncJobStage"}],"description":"Job running stage"},"job_progress":{"type":"integer","title":"Job Progress","description":"Job running progress, 100 is for finished."},"job_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Status","description":"Job running status in text"},"job_step_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Step Preview","description":"Preview image of generation steps at current time, as base64 image"},"job_result":{"anyOf":[{"items":{"$ref":"#/components/schemas/GeneratedImageResult"},"type":"array"},{"type":"null"}],"title":"Job Result","description":"Job generation result"}},"type":"object","required":["job_id","job_type","job_stage","job_progress"],"title":"AsyncJobResponse"},"AsyncJobStage":{"type":"string","enum":["WAITING","RUNNING","SUCCESS","ERROR"],"title":"AsyncJobStage"},"Body_describe_image_v1_tools_describe_image_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["image"],"title":"Body_describe_image_v1_tools_describe_image_post"},"Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, -1 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, -1 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, -1 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, -1 for default","default":0},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image"],"title":"Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"},"Body_img_prompt_v1_generation_image_prompt_post":{"properties":{"cn_img1":{"type":"string","format":"binary","title":"Cn Img1","description":"Input image for image prompt"},"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, 0 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, 0 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, 0 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, 0 for default","default":0},"cn_stop1":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop1","description":"Stop at for image prompt, None for default value"},"cn_weight1":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight1","description":"Weight for image prompt, None for default value"},"cn_type1":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img2":{"type":"string","format":"binary","title":"Cn Img2","description":"Input image for image prompt"},"cn_stop2":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop2","description":"Stop at for image prompt, None for default value"},"cn_weight2":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight2","description":"Weight for image prompt, None for default value"},"cn_type2":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img3":{"type":"string","format":"binary","title":"Cn Img3","description":"Input image for image prompt"},"cn_stop3":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop3","description":"Stop at for image prompt, None for default value"},"cn_weight3":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight3","description":"Weight for image prompt, None for default value"},"cn_type3":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img4":{"type":"string","format":"binary","title":"Cn Img4","description":"Input image for image prompt"},"cn_stop4":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop4","description":"Stop at for image prompt, None for default value"},"cn_weight4":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight4","description":"Weight for image prompt, None for default value"},"cn_type4":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","title":"Body_img_prompt_v1_generation_image_prompt_post"},"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for upsacale or outpaint"},"uov_method":{"$ref":"#/components/schemas/UpscaleOrVaryMethod"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, None for default value"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image","uov_method"],"title":"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"},"ControlNetType":{"type":"string","enum":["ImagePrompt","FaceSwap","PyraCanny","CPDS"],"title":"ControlNetType"},"DescribeImageResponse":{"properties":{"describe":{"type":"string","title":"Describe"}},"type":"object","required":["describe"],"title":"DescribeImageResponse"},"DescribeImageType":{"type":"string","enum":["Photo","Anime"],"title":"DescribeImageType"},"GeneratedImageResult":{"properties":{"base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64","description":"Image encoded in base64, or null if finishReasen is not 'SUCCESS', only return when request require base64"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Image file static serve url, or null if finishReasen is not 'SUCCESS'"},"seed":{"type":"string","title":"Seed","description":"The seed associated with this image"},"finish_reason":{"$ref":"#/components/schemas/GenerationFinishReason"}},"type":"object","required":["base64","url","seed","finish_reason"],"title":"GeneratedImageResult"},"GenerationFinishReason":{"type":"string","enum":["SUCCESS","QUEUE_IS_FULL","USER_CANCEL","ERROR"],"title":"GenerationFinishReason"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImagePrompt":{"properties":{"cn_img":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Cn Img"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop"},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"None for default value"},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"default":"ImagePrompt"}},"type":"object","title":"ImagePrompt"},"ImagePromptJson":{"properties":{"cn_img":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cn Img","description":"Input image for image prompt as base64"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop","description":"Stop at for image prompt, 0 for default value","default":0},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"Weight for image prompt, 0 for default value","default":0},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"}},"type":"object","title":"ImagePromptJson"},"ImgInpaintOrOutpaintRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status."},"input_image":{"type":"string","title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64","default":""},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint","default":""},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Left","description":"Set outpaint left distance","default":-1},"outpaint_distance_right":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Right","description":"Set outpaint right distance","default":-1},"outpaint_distance_top":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Top","description":"Set outpaint top distance","default":-1},"outpaint_distance_bottom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance","default":-1}},"type":"object","required":["input_image"],"title":"ImgInpaintOrOutpaintRequestJson"},"ImgPromptRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status."},"input_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64","default":""},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint","default":""},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Left","description":"Set outpaint left distance","default":-1},"outpaint_distance_right":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Right","description":"Set outpaint right distance","default":-1},"outpaint_distance_top":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Top","description":"Set outpaint top distance","default":-1},"outpaint_distance_bottom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance","default":-1},"image_prompts":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImagePromptJson"},{"$ref":"#/components/schemas/ImagePrompt"}]},"type":"array","title":"Image Prompts"}},"type":"object","required":["image_prompts"],"title":"ImgPromptRequestJson"},"ImgUpscaleOrVaryRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status."},"uov_method":{"allOf":[{"$ref":"#/components/schemas/UpscaleOrVaryMethod"}],"default":"Upscale (2x)"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, 1.0 for default value","default":1.0},"input_image":{"type":"string","title":"Input Image","description":"Init image for upsacale or outpaint as base64"}},"type":"object","required":["input_image"],"title":"ImgUpscaleOrVaryRequestJson"},"JobHistoryInfo":{"properties":{"job_id":{"type":"string","title":"Job Id"},"is_finished":{"type":"boolean","title":"Is Finished","default":false}},"type":"object","required":["job_id"],"title":"JobHistoryInfo"},"JobHistoryResponse":{"properties":{"queue":{"items":{"$ref":"#/components/schemas/JobHistoryInfo"},"type":"array","title":"Queue","default":[]},"history":{"items":{"$ref":"#/components/schemas/JobHistoryInfo"},"type":"array","title":"History","default":[]}},"type":"object","title":"JobHistoryResponse"},"JobQueueInfo":{"properties":{"running_size":{"type":"integer","title":"Running Size","description":"The current running and waiting job count"},"finished_size":{"type":"integer","title":"Finished Size","description":"Finished job cound (after auto clean)"},"last_job_id":{"type":"string","title":"Last Job Id","description":"Last submit generation job id"}},"type":"object","required":["running_size","finished_size","last_job_id"],"title":"JobQueueInfo"},"Lora":{"properties":{"model_name":{"type":"string","title":"Model Name"},"weight":{"type":"number","maximum":2.0,"minimum":-2.0,"title":"Weight","default":0.5}},"type":"object","required":["model_name"],"title":"Lora"},"OutpaintExpansion":{"type":"string","enum":["Left","Right","Top","Bottom"],"title":"OutpaintExpansion"},"PerfomanceSelection":{"type":"string","enum":["Speed","Quality","Extreme Speed"],"title":"PerfomanceSelection"},"StopResponse":{"properties":{"msg":{"type":"string","title":"Msg"}},"type":"object","required":["msg"],"title":"StopResponse"},"TaskType":{"type":"string","enum":["Text to Image","Image Upscale or Variation","Image Inpaint or Outpaint","Image Prompt","Not Found"],"title":"TaskType"},"Text2ImgRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status."}},"type":"object","title":"Text2ImgRequest"},"Text2ImgRequestWithPrompt":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status."},"image_prompts":{"items":{"$ref":"#/components/schemas/ImagePromptJson"},"type":"array","title":"Image Prompts","default":[]}},"type":"object","title":"Text2ImgRequestWithPrompt"},"UpscaleOrVaryMethod":{"type":"string","enum":["Vary (Subtle)","Vary (Strong)","Upscale (1.5x)","Upscale (2x)","Upscale (Fast 2x)","Upscale (Custom)"],"title":"UpscaleOrVaryMethod"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ping":{"get":{"summary":"Ping","description":"Returns a simple 'pong' response","operationId":"ping_ping_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/generation/text-to-image":{"post":{"summary":"Text2Img Generation","operationId":"text2img_generation_v1_generation_text_to_image_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2ImgRequest"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Text2Img Generation V1 Generation Text To Image Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/text-to-image-with-ip":{"post":{"summary":"Text To Img With Ip","operationId":"text_to_img_with_ip_v2_generation_text_to_image_with_ip_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2ImgRequestWithPrompt"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Text To Img With Ip V2 Generation Text To Image With Ip Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary","operationId":"img_upscale_or_vary_v1_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V1 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary V2","operationId":"img_upscale_or_vary_v2_v2_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgUpscaleOrVaryRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V2 V2 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-inpaint-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint","operationId":"img_inpaint_or_outpaint_v1_generation_image_inpaint_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_inpaint_or_outpaint_v1_generation_image_inpaint_outpaint_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V1 Generation Image Inpaint Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-inpaint-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint V2","operationId":"img_inpaint_or_outpaint_v2_v2_generation_image_inpaint_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgInpaintOrOutpaintRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V2 V2 Generation Image Inpaint Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v1_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_img_prompt_v1_generation_image_prompt_post"}],"title":"Body"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V1 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v2_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgPromptRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V2 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/query-job":{"get":{"summary":"Query Job","description":"Query async generation job","operationId":"query_job_v1_generation_query_job_get","parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"require_step_preview","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Require Step Preview"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/job-queue":{"get":{"summary":"Job Queue","description":"Query job queue info","operationId":"job_queue_v1_generation_job_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobQueueInfo"}}}}}}},"/v1/generation/job-history":{"get":{"summary":"Get History","description":"Query historical job data","operationId":"get_history_v1_generation_job_history_get","parameters":[{"name":"job_id","in":"query","required":false,"schema":{"type":"string","title":"Job Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/JobHistoryResponse"},{"type":"object"}],"title":"Response Get History V1 Generation Job History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/stop":{"post":{"summary":"Stop","description":"Job stoping","operationId":"stop_v1_generation_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopResponse"}}}}}}},"/v1/tools/describe-image":{"post":{"summary":"Describe Image","operationId":"describe_image_v1_tools_describe_image_post","parameters":[{"name":"type","in":"query","required":false,"schema":{"allOf":[{"$ref":"#/components/schemas/DescribeImageType"}],"description":"Image type, 'Photo' or 'Anime'","default":"Photo","title":"Type"},"description":"Image type, 'Photo' or 'Anime'"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_describe_image_v1_tools_describe_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DescribeImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/engines/all-models":{"get":{"summary":"All Models","description":"Get all filenames of base model and lora","operationId":"all_models_v1_engines_all_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/refresh-models":{"post":{"summary":"Refresh Models","description":"Refresh local files and get all filenames of base model and lora","operationId":"refresh_models_v1_engines_refresh_models_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/styles":{"get":{"summary":"All Styles","description":"Get all legal Fooocus styles","operationId":"all_styles_v1_engines_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response All Styles V1 Engines Styles Get"}}}}}}}},"components":{"schemas":{"AdvancedParams":{"properties":{"disable_preview":{"type":"boolean","title":"Disable Preview","description":"Disable preview during generation","default":false},"adm_scaler_positive":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Positive","description":"Positive ADM Guidance Scaler","default":1.5},"adm_scaler_negative":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Negative","description":"Negative ADM Guidance Scaler","default":0.8},"adm_scaler_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Adm Scaler End","description":"ADM Guidance End At Step","default":0.3},"refiner_swap_method":{"type":"string","title":"Refiner Swap Method","description":"Refiner swap method","default":"joint"},"adaptive_cfg":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Adaptive Cfg","description":"CFG Mimicking from TSNR","default":7.0},"sampler_name":{"type":"string","title":"Sampler Name","description":"Sampler","default":"dpmpp_2m_sde_gpu"},"scheduler_name":{"type":"string","title":"Scheduler Name","description":"Scheduler","default":"karras"},"overwrite_step":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Step","description":"Forced Overwrite of Sampling Step","default":-1},"overwrite_switch":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Switch","description":"Forced Overwrite of Refiner Switch Step","default":-1},"overwrite_width":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Width","description":"Forced Overwrite of Generating Width","default":-1},"overwrite_height":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Height","description":"Forced Overwrite of Generating Height","default":-1},"overwrite_vary_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Vary Strength","description":"Forced Overwrite of Denoising Strength of \"Vary\"","default":-1},"overwrite_upscale_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Upscale Strength","description":"Forced Overwrite of Denoising Strength of \"Upscale\"","default":-1},"mixing_image_prompt_and_vary_upscale":{"type":"boolean","title":"Mixing Image Prompt And Vary Upscale","description":"Mixing Image Prompt and Vary/Upscale","default":false},"mixing_image_prompt_and_inpaint":{"type":"boolean","title":"Mixing Image Prompt And Inpaint","description":"Mixing Image Prompt and Inpaint","default":false},"debugging_cn_preprocessor":{"type":"boolean","title":"Debugging Cn Preprocessor","description":"Debug Preprocessors","default":false},"skipping_cn_preprocessor":{"type":"boolean","title":"Skipping Cn Preprocessor","description":"Skip Preprocessors","default":false},"controlnet_softness":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Controlnet Softness","description":"Softness of ControlNet","default":0.25},"canny_low_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny Low Threshold","description":"Canny Low Threshold","default":64},"canny_high_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny High Threshold","description":"Canny High Threshold","default":128},"freeu_enabled":{"type":"boolean","title":"Freeu Enabled","description":"FreeU enabled","default":false},"freeu_b1":{"type":"number","title":"Freeu B1","description":"FreeU B1","default":1.01},"freeu_b2":{"type":"number","title":"Freeu B2","description":"FreeU B2","default":1.02},"freeu_s1":{"type":"number","title":"Freeu S1","description":"FreeU B3","default":0.99},"freeu_s2":{"type":"number","title":"Freeu S2","description":"FreeU B4","default":0.95},"debugging_inpaint_preprocessor":{"type":"boolean","title":"Debugging Inpaint Preprocessor","description":"Debug Inpaint Preprocessing","default":false},"inpaint_disable_initial_latent":{"type":"boolean","title":"Inpaint Disable Initial Latent","description":"Disable initial latent in inpaint","default":false},"inpaint_engine":{"type":"string","title":"Inpaint Engine","description":"Inpaint Engine","default":"v1"},"inpaint_strength":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Strength","description":"Inpaint Denoising Strength","default":1.0},"inpaint_respective_field":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Respective Field","description":"Inpaint Respective Field","default":1.0},"invert_mask_checkbox":{"type":"boolean","title":"Invert Mask Checkbox","description":"Invert Mask","default":false},"inpaint_erode_or_dilate":{"type":"integer","maximum":64.0,"minimum":-64.0,"title":"Inpaint Erode Or Dilate","description":"Mask Erode or Dilate","default":0}},"type":"object","title":"AdvancedParams"},"AllModelNamesResponse":{"properties":{"model_filenames":{"items":{"type":"string"},"type":"array","title":"Model Filenames","description":"All available model filenames"},"lora_filenames":{"items":{"type":"string"},"type":"array","title":"Lora Filenames","description":"All available lora filenames"}},"type":"object","required":["model_filenames","lora_filenames"],"title":"AllModelNamesResponse"},"AsyncJobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Job ID"},"job_type":{"allOf":[{"$ref":"#/components/schemas/TaskType"}],"description":"Job type"},"job_stage":{"allOf":[{"$ref":"#/components/schemas/AsyncJobStage"}],"description":"Job running stage"},"job_progress":{"type":"integer","title":"Job Progress","description":"Job running progress, 100 is for finished."},"job_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Status","description":"Job running status in text"},"job_step_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Step Preview","description":"Preview image of generation steps at current time, as base64 image"},"job_result":{"anyOf":[{"items":{"$ref":"#/components/schemas/GeneratedImageResult"},"type":"array"},{"type":"null"}],"title":"Job Result","description":"Job generation result"}},"type":"object","required":["job_id","job_type","job_stage","job_progress"],"title":"AsyncJobResponse"},"AsyncJobStage":{"type":"string","enum":["WAITING","RUNNING","SUCCESS","ERROR"],"title":"AsyncJobStage"},"Body_describe_image_v1_tools_describe_image_post":{"properties":{"image":{"type":"string","format":"binary","title":"Image"}},"type":"object","required":["image"],"title":"Body_describe_image_v1_tools_describe_image_post"},"Body_img_inpaint_or_outpaint_v1_generation_image_inpaint_outpaint_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, -1 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, -1 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, -1 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, -1 for default","default":0},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"description":"Performance Selection, one of 'Speed','Quality','Extreme Speed'","default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","description":"Aspect Ratios Selection, default 1152*896","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image"],"title":"Body_img_inpaint_or_outpaint_v1_generation_image_inpaint_outpaint_post"},"Body_img_prompt_v1_generation_image_prompt_post":{"properties":{"cn_img1":{"type":"string","format":"binary","title":"Cn Img1","description":"Input image for image prompt"},"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, 0 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, 0 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, 0 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, 0 for default","default":0},"cn_stop1":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop1","description":"Stop at for image prompt, None for default value"},"cn_weight1":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight1","description":"Weight for image prompt, None for default value"},"cn_type1":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img2":{"type":"string","format":"binary","title":"Cn Img2","description":"Input image for image prompt"},"cn_stop2":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop2","description":"Stop at for image prompt, None for default value"},"cn_weight2":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight2","description":"Weight for image prompt, None for default value"},"cn_type2":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img3":{"type":"string","format":"binary","title":"Cn Img3","description":"Input image for image prompt"},"cn_stop3":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop3","description":"Stop at for image prompt, None for default value"},"cn_weight3":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight3","description":"Weight for image prompt, None for default value"},"cn_type3":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img4":{"type":"string","format":"binary","title":"Cn Img4","description":"Input image for image prompt"},"cn_stop4":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop4","description":"Stop at for image prompt, None for default value"},"cn_weight4":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight4","description":"Weight for image prompt, None for default value"},"cn_type4":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","title":"Body_img_prompt_v1_generation_image_prompt_post"},"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for upsacale or outpaint"},"uov_method":{"$ref":"#/components/schemas/UpscaleOrVaryMethod"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, None for default value"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"description":"Performance Selection, one of 'Speed','Quality','Extreme Speed'","default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","description":"Aspect Ratios Selection, default 1152*896","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","description":"checkpoint file name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","description":"refiner file name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image","uov_method"],"title":"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"},"ControlNetType":{"type":"string","enum":["ImagePrompt","FaceSwap","PyraCanny","CPDS"],"title":"ControlNetType"},"DescribeImageResponse":{"properties":{"describe":{"type":"string","title":"Describe"}},"type":"object","required":["describe"],"title":"DescribeImageResponse"},"DescribeImageType":{"type":"string","enum":["Photo","Anime"],"title":"DescribeImageType"},"GeneratedImageResult":{"properties":{"base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64","description":"Image encoded in base64, or null if finishReasen is not 'SUCCESS', only return when request require base64"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Image file static serve url, or null if finishReasen is not 'SUCCESS'"},"seed":{"type":"string","title":"Seed","description":"The seed associated with this image"},"finish_reason":{"$ref":"#/components/schemas/GenerationFinishReason"}},"type":"object","required":["base64","url","seed","finish_reason"],"title":"GeneratedImageResult"},"GenerationFinishReason":{"type":"string","enum":["SUCCESS","QUEUE_IS_FULL","USER_CANCEL","ERROR"],"title":"GenerationFinishReason"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImagePrompt":{"properties":{"cn_img":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Cn Img"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop"},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"None for default value"},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"default":"ImagePrompt"}},"type":"object","title":"ImagePrompt"},"ImagePromptJson":{"properties":{"cn_img":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cn Img","description":"Input image for image prompt as base64"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop","description":"Stop at for image prompt, 0 for default value","default":0},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"Weight for image prompt, 0 for default value","default":0},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"}},"type":"object","title":"ImagePromptJson"},"ImgInpaintOrOutpaintRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status.","default":""},"input_image":{"type":"string","title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64","default":""},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint","default":""},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Left","description":"Set outpaint left distance","default":-1},"outpaint_distance_right":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Right","description":"Set outpaint right distance","default":-1},"outpaint_distance_top":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Top","description":"Set outpaint top distance","default":-1},"outpaint_distance_bottom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance","default":-1},"image_prompts":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImagePromptJson"},{"$ref":"#/components/schemas/ImagePrompt"}]},"type":"array","title":"Image Prompts","default":[]}},"type":"object","required":["input_image"],"title":"ImgInpaintOrOutpaintRequestJson"},"ImgPromptRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status.","default":""},"input_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64","default":""},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint","default":""},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Left","description":"Set outpaint left distance","default":-1},"outpaint_distance_right":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Right","description":"Set outpaint right distance","default":-1},"outpaint_distance_top":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Top","description":"Set outpaint top distance","default":-1},"outpaint_distance_bottom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance","default":-1},"image_prompts":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImagePromptJson"},{"$ref":"#/components/schemas/ImagePrompt"}]},"type":"array","title":"Image Prompts"}},"type":"object","required":["image_prompts"],"title":"ImgPromptRequestJson"},"ImgUpscaleOrVaryRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status.","default":""},"uov_method":{"allOf":[{"$ref":"#/components/schemas/UpscaleOrVaryMethod"}],"default":"Upscale (2x)"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, 1.0 for default value","default":1.0},"input_image":{"type":"string","title":"Input Image","description":"Init image for upsacale or outpaint as base64"},"image_prompts":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImagePromptJson"},{"$ref":"#/components/schemas/ImagePrompt"}]},"type":"array","title":"Image Prompts","default":[]}},"type":"object","required":["input_image"],"title":"ImgUpscaleOrVaryRequestJson"},"JobHistoryInfo":{"properties":{"job_id":{"type":"string","title":"Job Id"},"is_finished":{"type":"boolean","title":"Is Finished","default":false}},"type":"object","required":["job_id"],"title":"JobHistoryInfo"},"JobHistoryResponse":{"properties":{"queue":{"items":{"$ref":"#/components/schemas/JobHistoryInfo"},"type":"array","title":"Queue","default":[]},"history":{"items":{"$ref":"#/components/schemas/JobHistoryInfo"},"type":"array","title":"History","default":[]}},"type":"object","title":"JobHistoryResponse"},"JobQueueInfo":{"properties":{"running_size":{"type":"integer","title":"Running Size","description":"The current running and waiting job count"},"finished_size":{"type":"integer","title":"Finished Size","description":"Finished job cound (after auto clean)"},"last_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Job Id","description":"Last submit generation job id"}},"type":"object","required":["running_size","finished_size","last_job_id"],"title":"JobQueueInfo"},"Lora":{"properties":{"model_name":{"type":"string","title":"Model Name"},"weight":{"type":"number","maximum":2.0,"minimum":-2.0,"title":"Weight","default":0.5}},"type":"object","required":["model_name"],"title":"Lora"},"OutpaintExpansion":{"type":"string","enum":["Left","Right","Top","Bottom"],"title":"OutpaintExpansion"},"PerfomanceSelection":{"type":"string","enum":["Speed","Quality","Extreme Speed"],"title":"PerfomanceSelection"},"StopResponse":{"properties":{"msg":{"type":"string","title":"Msg"}},"type":"object","required":["msg"],"title":"StopResponse"},"TaskType":{"type":"string","enum":["Text to Image","Image Upscale or Variation","Image Inpaint or Outpaint","Image Prompt","Not Found"],"title":"TaskType"},"Text2ImgRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status.","default":""}},"type":"object","title":"Text2ImgRequest"},"Text2ImgRequestWithPrompt":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_erode_or_dilate":0,"inpaint_respective_field":1.0,"inpaint_strength":1.0,"invert_mask_checkbox":false,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Optional URL for a webhook callback. If provided, the system will send a POST request to this URL upon task completion or failure. This allows for asynchronous notification of task status.","default":""},"image_prompts":{"items":{"$ref":"#/components/schemas/ImagePromptJson"},"type":"array","title":"Image Prompts","default":[]}},"type":"object","title":"Text2ImgRequestWithPrompt"},"UpscaleOrVaryMethod":{"type":"string","enum":["Vary (Subtle)","Vary (Strong)","Upscale (1.5x)","Upscale (2x)","Upscale (Fast 2x)","Upscale (Custom)"],"title":"UpscaleOrVaryMethod"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file diff --git a/examples/examples.ipynb b/examples/examples.ipynb index ba4eb29..b1fc7ff 100644 --- a/examples/examples.ipynb +++ b/examples/examples.ipynb @@ -130,7 +130,7 @@ " \"\"\"\n", " Partial redraw v1 interface example\n", " \"\"\"\n", - " response = requests.post(url=f\"{host}/v1/generation/image-inpait-outpaint\",\n", + " response = requests.post(url=f\"{host}/v1/generation/image-inpaint-outpaint\",\n", " data=params,\n", " files={\"input_image\": input_image,\n", " \"input_mask\": input_mask})\n", @@ -182,7 +182,7 @@ " \"\"\"\n", " Partial redraw v2 interface example\n", " \"\"\"\n", - " response = requests.post(url=f\"{host}/v2/generation/image-inpait-outpaint\",\n", + " response = requests.post(url=f\"{host}/v2/generation/image-inpaint-outpaint\",\n", " data=json.dumps(params),\n", " headers={\"Content-Type\": \"application/json\"})\n", " return response.json()\n", diff --git a/examples/examples.py b/examples/examples.py index 5e4e26b..46e36cd 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -12,8 +12,8 @@ class Config(): text2img = '/v1/generation/text-to-image' img_upscale = '/v2/generation/image-upscale-vary' img_upscale1 = '/v1/generation/image-upscale-vary' - inpaint_outpaint = '/v2/generation/image-inpait-outpaint' - inpaint_outpaint1 = '/v1/generation/image-inpait-outpaint' + inpaint_outpaint = '/v2/generation/image-inpaint-outpaint' + inpaint_outpaint1 = '/v1/generation/image-inpaint-outpaint' img_prompt = '/v2/generation/image-prompt' img_prompt1 = '/v1/generation/image-prompt' @@ -131,5 +131,5 @@ def image_prompt_with_inpaint(img_prompt: list, input_image: str, input_mask: st ] # print(upscale_vary(image=image_base64)) # print(inpaint_outpaint(input_image=s_base64, input_mask=m_base64)) -# print(image_prompt(img_prompt=img_prompt, params=img_prompt_params)) +print(image_prompt(img_prompt=img_prompt, params=img_prompt_params)) print(image_prompt_with_inpaint(img_prompt=img_prompt, input_image=s_base64, input_mask=m_base64, params=img_prompt_params)) diff --git a/fooocus_api_version.py b/fooocus_api_version.py index 289b636..624fc9c 100644 --- a/fooocus_api_version.py +++ b/fooocus_api_version.py @@ -1 +1 @@ -version = '0.3.29' +version = '0.3.30' diff --git a/fooocusapi/api.py b/fooocusapi/api.py index 88dc47a..0bc4d34 100644 --- a/fooocusapi/api.py +++ b/fooocusapi/api.py @@ -1,7 +1,6 @@ import uvicorn from typing import List, Optional -from fastapi.responses import JSONResponse from fastapi import Depends, FastAPI, Header, Query, Response, UploadFile from fastapi.params import File from fastapi.staticfiles import StaticFiles @@ -12,12 +11,11 @@ from fooocusapi.api_utils import req_to_params, generate_async_output, generate_streaming_output, generate_image_result_output import fooocusapi.file_utils as file_utils from fooocusapi.parameters import GenerationFinishReason, ImageGenerationResult -from fooocusapi.task_queue import QueueTask, TaskType -from fooocusapi.worker import process_generate, task_queue, process_top +from fooocusapi.task_queue import TaskType +from fooocusapi.worker import worker_queue, process_top, blocking_get_task_result from fooocusapi.models_v2 import * from fooocusapi.img_utils import base64_to_stream, read_input_image -from concurrent.futures import ThreadPoolExecutor from modules.util import HWC3 app = FastAPI() @@ -30,9 +28,6 @@ allow_headers=["*"], # Allow all request headers ) -work_executor = ThreadPoolExecutor( - max_workers=task_queue.queue_size * 2, thread_name_prefix="worker_") - img_generate_responses = { "200": { "description": "PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON", @@ -64,43 +59,29 @@ def get_task_type(req: Text2ImgRequest) -> TaskType: elif isinstance(req, ImgPromptRequest) or isinstance(req, ImgPromptRequestJson): return TaskType.img_prompt elif isinstance(req, ImgInpaintOrOutpaintRequest) or isinstance(req, ImgInpaintOrOutpaintRequestJson): - return TaskType.img_inpaint_outpaint + return TaskType.img_inpaint_outpaiFnt else: return TaskType.text_2_img -def call_worker(req: Text2ImgRequest, accept: str) -> Tuple[QueueTask | None, List[ImageGenerationResult] | None]: - task_type = get_task_type(req) - params = req_to_params(req) - queue_task = task_queue.add_task( - task_type, {'params': params.__dict__, 'accept': accept, 'require_base64': req.require_base64}, - webhook_url=req.webhook_url) - - if queue_task is None: - print("[Task Queue] The task queue has reached limit") - return None, [ImageGenerationResult(im=None, seed='', - finish_reason=GenerationFinishReason.queue_is_full)] - elif req.async_process: - work_executor.submit(process_generate, queue_task, params) - return queue_task, None +def call_worker(req: Text2ImgRequest, accept: str) -> Response | AsyncJobResponse | List[GeneratedImageResult]: + if accept == 'image/png': + streaming_output = True + # image_number auto set to 1 in streaming mode + req.image_number = 1 else: - results = process_generate(queue_task, params) - return queue_task, results - - -def build_generation_response(req: Text2ImgRequest, - streaming_output: bool, - task: QueueTask | None, - results: List[ImageGenerationResult] | None) -> Response | AsyncJobResponse | List[GeneratedImageResult]: - if streaming_output: - return generate_streaming_output([] if results is None else results) + streaming_output = False - job_result: List[GeneratedImageResult] = [] - if results is not None: - job_result = generate_image_result_output(results, req.require_base64) + task_type = get_task_type(req) + params = req_to_params(req) + async_task = worker_queue.add_task(task_type, params, req.webhook_url) - if task is None: + if async_task is None: # add to worker queue failed + failure_results = [ImageGenerationResult(im=None, seed='', finish_reason=GenerationFinishReason.queue_is_full)] + + if streaming_output: + return generate_streaming_output(failure_results) if req.async_process: return AsyncJobResponse(job_id='', job_type=get_task_type(req), @@ -108,13 +89,21 @@ def build_generation_response(req: Text2ImgRequest, job_progress=0, job_status=None, job_step_preview=None, - job_result=job_result) - return job_result + job_result=failure_results) + else: + return generate_image_result_output(failure_results, False) if req.async_process: - return generate_async_output(task) + # return async response directly + return generate_async_output(async_task) + + # blocking get generation result + results = blocking_get_task_result(async_task.job_id) + + if streaming_output: + return generate_streaming_output(results) else: - return job_result + return generate_image_result_output(results, req.require_base64) def stop_worker(): @@ -137,15 +126,7 @@ def text2img_generation(req: Text2ImgRequest, accept: str = Header(None), if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) @app.post("/v2/generation/text-to-image-with-ip", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) @@ -155,13 +136,6 @@ def text_to_img_with_ip(req: Text2ImgRequestWithPrompt, if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - default_image_promt = ImagePrompt(cn_img=None) image_prompts_files: List[ImagePrompt] = [] for img_prompt in req.image_prompts: @@ -177,8 +151,7 @@ def text_to_img_with_ip(req: Text2ImgRequestWithPrompt, req.image_prompts = image_prompts_files - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) @app.post("/v1/generation/image-upscale-vary", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) @@ -188,15 +161,7 @@ def img_upscale_or_vary(input_image: UploadFile, req: ImgUpscaleOrVaryRequest = if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) @app.post("/v2/generation/image-upscale-vary", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) @@ -206,12 +171,6 @@ def img_upscale_or_vary_v2(req: ImgUpscaleOrVaryRequestJson, if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False req.input_image = base64_to_stream(req.input_image) default_image_promt = ImagePrompt(cn_img=None) @@ -227,42 +186,26 @@ def img_upscale_or_vary_v2(req: ImgUpscaleOrVaryRequestJson, image_prompts_files.append(default_image_promt) req.image_prompts = image_prompts_files - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) -@app.post("/v1/generation/image-inpait-outpaint", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) +@app.post("/v1/generation/image-inpaint-outpaint", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) def img_inpaint_or_outpaint(input_image: UploadFile, req: ImgInpaintOrOutpaintRequest = Depends(ImgInpaintOrOutpaintRequest.as_form), accept: str = Header(None), accept_query: str | None = Query(None, alias='accept', description="Parameter to overvide 'Accept' header, 'image/png' for output bytes")): if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) -@app.post("/v2/generation/image-inpait-outpaint", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) +@app.post("/v2/generation/image-inpaint-outpaint", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) def img_inpaint_or_outpaint_v2(req: ImgInpaintOrOutpaintRequestJson, accept: str = Header(None), accept_query: str | None = Query(None, alias='accept', description="Parameter to overvide 'Accept' header, 'image/png' for output bytes")): if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - req.input_image = base64_to_stream(req.input_image) if req.input_mask is not None: req.input_mask = base64_to_stream(req.input_mask) @@ -279,8 +222,7 @@ def img_inpaint_or_outpaint_v2(req: ImgInpaintOrOutpaintRequestJson, image_prompts_files.append(default_image_promt) req.image_prompts = image_prompts_files - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) @app.post("/v1/generation/image-prompt", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) @@ -291,15 +233,7 @@ def img_prompt(cn_img1: Optional[UploadFile] = File(None), if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) @app.post("/v2/generation/image-prompt", response_model=List[GeneratedImageResult] | AsyncJobResponse, responses=img_generate_responses) @@ -309,13 +243,6 @@ def img_prompt(req: ImgPromptRequestJson, if accept_query is not None and len(accept_query) > 0: accept = accept_query - if accept == 'image/png': - streaming_output = True - # image_number auto set to 1 in streaming mode - req.image_number = 1 - else: - streaming_output = False - if req.input_image is not None: req.input_image = base64_to_stream(req.input_image) if req.input_mask is not None: @@ -336,13 +263,12 @@ def img_prompt(req: ImgPromptRequestJson, req.image_prompts = image_prompts_files - task, results = call_worker(req, accept) - return build_generation_response(req, streaming_output, task, results) + return call_worker(req, accept) @app.get("/v1/generation/query-job", response_model=AsyncJobResponse, description="Query async generation job") def query_job(req: QueryJobRequest = Depends()): - queue_task = task_queue.get_task(req.job_id, True) + queue_task = worker_queue.get_task(req.job_id, True) if queue_task is None: result = AsyncJobResponse(job_id="", job_type=TaskType.not_found, @@ -351,20 +277,20 @@ def query_job(req: QueryJobRequest = Depends()): job_status="Job not found") content = result.model_dump_json() return Response(content=content, media_type='application/json', status_code=404) - return generate_async_output(queue_task) + return generate_async_output(queue_task, req.require_step_preview) @app.get("/v1/generation/job-queue", response_model=JobQueueInfo, description="Query job queue info") def job_queue(): - return JobQueueInfo(running_size=len(task_queue.queue), finished_size=len(task_queue.history), last_job_id=task_queue.last_job_id) + return JobQueueInfo(running_size=len(worker_queue.queue), finished_size=len(worker_queue.history), last_job_id=worker_queue.last_job_id) @app.get("/v1/generation/job-history", response_model=JobHistoryResponse | dict, description="Query historical job data") def get_history(job_id: str = None, page: int = 0, page_size: int = 20): # Fetch and return the historical tasks - queue = [JobHistoryInfo(job_id=item.job_id, is_finished=item.is_finished) for item in task_queue.queue] + queue = [JobHistoryInfo(job_id=item.job_id, is_finished=item.is_finished) for item in worker_queue.queue] if not args.persistent: - history = [JobHistoryInfo(job_id=item.job_id, is_finished=item.is_finished) for item in task_queue.history] + history = [JobHistoryInfo(job_id=item.job_id, is_finished=item.is_finished) for item in worker_queue.history] return JobHistoryResponse(history=history, queue=queue) else: from fooocusapi.sql_client import query_history diff --git a/fooocusapi/api_utils.py b/fooocusapi/api_utils.py index 1ae6888..d53c5c3 100644 --- a/fooocusapi/api_utils.py +++ b/fooocusapi/api_utils.py @@ -156,10 +156,11 @@ def req_to_params(req: Text2ImgRequest) -> ImageGenerationParams: inpaint_additional_prompt=inpaint_additional_prompt, image_prompts=image_prompts, advanced_params=advanced_params, + require_base64=req.require_base64, ) -def generate_async_output(task: QueueTask) -> AsyncJobResponse: +def generate_async_output(task: QueueTask, require_step_preview: bool = False) -> AsyncJobResponse: job_stage = AsyncJobStage.running job_result = None @@ -171,17 +172,13 @@ def generate_async_output(task: QueueTask) -> AsyncJobResponse: job_stage = AsyncJobStage.error elif task.task_result != None: job_stage = AsyncJobStage.success - task_result_require_base64 = False - if 'require_base64' in task.req_param and task.req_param['require_base64']: - task_result_require_base64 = True - - job_result = generate_image_result_output(task.task_result, task_result_require_base64) + job_result = generate_image_result_output(task.task_result, task.req_param.require_base64) return AsyncJobResponse(job_id=task.job_id, job_type=task.type, job_stage=job_stage, job_progress=task.finish_progress, job_status=task.task_status, - job_step_preview=task.task_step_preview, + job_step_preview= task.task_step_preview if require_step_preview else None, job_result=job_result) diff --git a/fooocusapi/base_args.py b/fooocusapi/base_args.py index 0a16a64..0c6e104 100644 --- a/fooocusapi/base_args.py +++ b/fooocusapi/base_args.py @@ -11,7 +11,7 @@ def add_base_args(parser: ArgumentParser, before_prepared: bool): parser.add_argument("--sync-repo", default=None, help="Sync dependent git repositories to local, 'skip' for skip sync action, 'only' for only do the sync action and not launch app") parser.add_argument("--skip-pip", default=False, action="store_true", help="Skip automatic pip install when setup") parser.add_argument("--preload-pipeline", default=False, action="store_true", help="Preload pipeline before start http server") - parser.add_argument("--queue-size", type=int, default=3, help="Working queue size, default: 3, generation requests exceeding working queue size will return failure") + parser.add_argument("--queue-size", type=int, default=100, help="Working queue size, default: 3, generation requests exceeding working queue size will return failure") parser.add_argument("--queue-history", type=int, default=0, help="Finished jobs reserve size, tasks exceeding the limit will be deleted, including output image files, default: 0, means no limit") parser.add_argument('--webhook-url', type=str, default=None, help='The URL to send a POST request when a job is finished') parser.add_argument('--persistent', default=False, action="store_true", help="Store history to db") \ No newline at end of file diff --git a/fooocusapi/models.py b/fooocusapi/models.py index b88578d..d4af980 100644 --- a/fooocusapi/models.py +++ b/fooocusapi/models.py @@ -405,7 +405,7 @@ class AsyncJobStage(str, Enum): class QueryJobRequest(BaseModel): job_id: str = Field(description="Job ID to query") - require_step_preivew: bool = Field(False, description="Set to true will return preview image of generation steps at current time") + require_step_preview: bool = Field(False, description="Set to true will return preview image of generation steps at current time") class AsyncJobResponse(BaseModel): diff --git a/fooocusapi/parameters.py b/fooocusapi/parameters.py index 9c735fe..1c456e5 100644 --- a/fooocusapi/parameters.py +++ b/fooocusapi/parameters.py @@ -100,7 +100,8 @@ def __init__(self, prompt: str, inpaint_input_image: Dict[str, np.ndarray] | None, inpaint_additional_prompt: str | None, image_prompts: List[Tuple[np.ndarray, float, float, str]], - advanced_params: List[any] | None): + advanced_params: List[any] | None, + require_base64: bool): self.prompt = prompt self.negative_prompt = negative_prompt self.style_selections = style_selections @@ -125,6 +126,7 @@ def __init__(self, prompt: str, self.inpaint_input_image = inpaint_input_image self.inpaint_additional_prompt = inpaint_additional_prompt self.image_prompts = image_prompts + self.require_base64 = require_base64 if advanced_params is None: disable_preview = False diff --git a/fooocusapi/task_queue.py b/fooocusapi/task_queue.py index 764a94c..88d42a5 100644 --- a/fooocusapi/task_queue.py +++ b/fooocusapi/task_queue.py @@ -8,7 +8,7 @@ from fooocusapi.file_utils import delete_output_file, get_file_serve_url from fooocusapi.img_utils import narray_to_base64img -from fooocusapi.parameters import ImageGenerationResult, GenerationFinishReason +from fooocusapi.parameters import ImageGenerationParams, ImageGenerationResult, GenerationFinishReason class TaskType(str, Enum): text_2_img = 'Text to Image' @@ -20,8 +20,11 @@ class TaskType(str, Enum): class QueueTask(object): job_id: str + type: TaskType + req_param: ImageGenerationParams is_finished: bool = False finish_progress: int = 0 + in_queue_millis: int start_millis: int = 0 finish_millis: int = 0 finish_with_error: bool = False @@ -31,7 +34,7 @@ class QueueTask(object): error_message: str | None = None webhook_url: str | None = None # attribute for individual webhook_url - def __init__(self, job_id: str, type: TaskType, req_param: dict, in_queue_millis: int, + def __init__(self, job_id: str, type: TaskType, req_param: ImageGenerationParams, in_queue_millis: int, webhook_url: str | None = None): self.job_id = job_id self.type = type @@ -70,7 +73,7 @@ def __init__(self, queue_size: int, hisotry_size: int, webhook_url: str | None = self.webhook_url = webhook_url self.persistent = False if persistent is None else persistent - def add_task(self, type: TaskType, req_param: dict, webhook_url: str | None = None) -> QueueTask | None: + def add_task(self, type: TaskType, req_param: ImageGenerationParams, webhook_url: str | None = None) -> QueueTask | None: """ Create and add task to queue :returns: The created task's job_id, or None if reach the queue size limit @@ -104,6 +107,13 @@ def is_task_ready_to_start(self, job_id: str) -> bool: return False return self.queue[0].job_id == job_id + + def is_task_finished(self, job_id: str) -> bool: + task = self.get_task(job_id, True) + if task is None: + return False + + return task.is_finished def start_task(self, job_id: str): task = self.get_task(job_id) diff --git a/fooocusapi/worker.py b/fooocusapi/worker.py index ad12598..a55af3f 100644 --- a/fooocusapi/worker.py +++ b/fooocusapi/worker.py @@ -8,10 +8,10 @@ from typing import List from fooocusapi.file_utils import save_output_file -from fooocusapi.parameters import GenerationFinishReason, ImageGenerationParams, ImageGenerationResult +from fooocusapi.parameters import GenerationFinishReason, ImageGenerationResult from fooocusapi.task_queue import QueueTask, TaskQueue, TaskOutputs -task_queue: TaskQueue +worker_queue: TaskQueue = None def process_top(): import ldm_patched.modules.model_management @@ -20,13 +20,45 @@ def process_top(): @torch.no_grad() @torch.inference_mode() -def process_generate(async_task: QueueTask, params: ImageGenerationParams) -> List[ImageGenerationResult]: +def task_schedule_loop(): + while True: + if len(worker_queue.queue) == 0: + time.sleep(0.05) + continue + + current_task = worker_queue.queue[0] + if current_task.start_millis == 0: + process_generate(current_task) + + +@torch.no_grad() +@torch.inference_mode() +def blocking_get_task_result(job_id: str) -> List[ImageGenerationResult]: + waiting_sleep_steps: int = 0 + waiting_start_time = time.perf_counter() + while not worker_queue.is_task_finished(job_id): + if waiting_sleep_steps == 0: + print(f"[Task Queue] Waiting for task finished, job_id={job_id}") + delay = 0.05 + time.sleep(delay) + waiting_sleep_steps += 1 + if waiting_sleep_steps % int(10 / delay) == 0: + waiting_time = time.perf_counter() - waiting_start_time + print(f"[Task Queue] Already waiting for {round(waiting_time, 1)} seconds, job_id={job_id}") + + task = worker_queue.get_task(job_id, True) + return task.task_result + + +@torch.no_grad() +@torch.inference_mode() +def process_generate(async_task: QueueTask): try: import modules.default_pipeline as pipeline except Exception as e: print('Import default pipeline error:', e) if not async_task.is_finished: - task_queue.finish_task(async_task.job_id) + worker_queue.finish_task(async_task.job_id) async_task.set_result([], True, str(e)) print(f"[Task Queue] Finish task with error, seq={async_task.job_id}") return [] @@ -78,35 +110,20 @@ def yield_result(_, imgs, tasks): img_filename = save_output_file(im) results.append(ImageGenerationResult(im=img_filename, seed=str(seed), finish_reason=GenerationFinishReason.success)) async_task.set_result(results, False) - task_queue.finish_task(async_task.job_id) + worker_queue.finish_task(async_task.job_id) print(f"[Task Queue] Finish task, job_id={async_task.job_id}") outputs.append(['results', imgs]) pipeline.prepare_text_encoder(async_call=True) - return results try: - waiting_sleep_steps: int = 0 - waiting_start_time = time.perf_counter() - while not task_queue.is_task_ready_to_start(async_task.job_id): - if waiting_sleep_steps == 0: - print( - f"[Task Queue] Waiting for task queue become free, job_id={async_task.job_id}") - delay = 0.1 - time.sleep(delay) - waiting_sleep_steps += 1 - if waiting_sleep_steps % int(10 / delay) == 0: - waiting_time = time.perf_counter() - waiting_start_time - print( - f"[Task Queue] Already waiting for {waiting_time}S, seq={async_task.job_id}") - - print(f"[Task Queue] Task queue is free, start task, job_id={async_task.job_id}") - - task_queue.start_task(async_task.job_id) + print(f"[Task Queue] Task queue start task, job_id={async_task.job_id}") + worker_queue.start_task(async_task.job_id) execution_start_time = time.perf_counter() # Transform parameters + params = async_task.req_param prompt = params.prompt negative_prompt = params.negative_prompt style_selections = params.style_selections @@ -530,7 +547,8 @@ def yield_result(_, imgs, tasks): if direct_return: d = [('Upscale (Fast)', '2x')] log(uov_input_image, d) - return yield_result(async_task, uov_input_image, tasks) + yield_result(async_task, uov_input_image, tasks) + return tiled = True denoising_strength = 0.382 @@ -611,8 +629,9 @@ def yield_result(_, imgs, tasks): ) if advanced_parameters.debugging_inpaint_preprocessor: - return yield_result(async_task, inpaint_worker.current_task.visualize_mask_processing(), + yield_result(async_task, inpaint_worker.current_task.visualize_mask_processing(), do_not_show_finished_images=True) + return progressbar(async_task, 13, 'VAE Inpaint encoding ...') @@ -674,7 +693,8 @@ def yield_result(_, imgs, tasks): cn_img = HWC3(cn_img) task[0] = core.numpy_to_pytorch(cn_img) if advanced_parameters.debugging_cn_preprocessor: - return yield_result(async_task, cn_img, tasks) + yield_result(async_task, cn_img, tasks) + return for task in cn_tasks[flags.cn_cpds]: cn_img, cn_stop, cn_weight = task cn_img = resize_image(HWC3(cn_img), width=width, height=height) @@ -685,7 +705,8 @@ def yield_result(_, imgs, tasks): cn_img = HWC3(cn_img) task[0] = core.numpy_to_pytorch(cn_img) if advanced_parameters.debugging_cn_preprocessor: - return yield_result(async_task, cn_img, tasks) + yield_result(async_task, cn_img, tasks) + return for task in cn_tasks[flags.cn_ip]: cn_img, cn_stop, cn_weight = task cn_img = HWC3(cn_img) @@ -695,7 +716,8 @@ def yield_result(_, imgs, tasks): task[0] = ip_adapter.preprocess(cn_img, ip_adapter_path=ip_adapter_path) if advanced_parameters.debugging_cn_preprocessor: - return yield_result(async_task, cn_img, tasks) + yield_result(async_task, cn_img, tasks) + return for task in cn_tasks[flags.cn_ip_face]: cn_img, cn_stop, cn_weight = task cn_img = HWC3(cn_img) @@ -708,7 +730,8 @@ def yield_result(_, imgs, tasks): task[0] = ip_adapter.preprocess(cn_img, ip_adapter_path=ip_adapter_face_path) if advanced_parameters.debugging_cn_preprocessor: - return yield_result(async_task, cn_img, tasks) + yield_result(async_task, cn_img, tasks) + return all_ip_tasks = cn_tasks[flags.cn_ip] + cn_tasks[flags.cn_ip_face] @@ -852,15 +875,15 @@ def callback(step, x0, x, total_steps, y): print(f'Generating and saving time: {execution_time:.2f} seconds') if async_task.finish_with_error: - task_queue.finish_task(async_task.job_id) + worker_queue.finish_task(async_task.job_id) return async_task.task_result - return yield_result(None, results, tasks) + yield_result(None, results, tasks) + return except Exception as e: print('Worker error:', e) logging.exception(e) if not async_task.is_finished: async_task.set_result([], True, str(e)) - task_queue.finish_task(async_task.job_id) + worker_queue.finish_task(async_task.job_id) print(f"[Task Queue] Finish task with error, job_id={async_task.job_id}") - return [] diff --git a/main.py b/main.py index b58f0a7..28a5fec 100644 --- a/main.py +++ b/main.py @@ -320,7 +320,7 @@ def prepare_environments(args) -> bool: # Init task queue import fooocusapi.worker as worker from fooocusapi.task_queue import TaskQueue - worker.task_queue = TaskQueue(queue_size=args.queue_size, hisotry_size=args.queue_history, webhook_url=args.webhook_url, persistent=args.persistent) + worker.worker_queue = TaskQueue(queue_size=args.queue_size, hisotry_size=args.queue_history, webhook_url=args.webhook_url, persistent=args.persistent) print(f"[Fooocus-API] Task queue size: {args.queue_size}, queue history size: {args.queue_history}, webhook url: {args.webhook_url}") return True @@ -342,7 +342,7 @@ class Args(object): disable_image_log = False skip_pip = False preload_pipeline = False - queue_size = 3 + queue_size = 100 queue_history = 0 preset = None webhook_url = None @@ -410,8 +410,13 @@ def preplaod_pipeline(): sys.argv = [sys.argv[0]] # Load pipeline in new thread - t = Thread(target=preplaod_pipeline, daemon=True) - t.start() + preload_pipeline_thread = Thread(target=preplaod_pipeline, daemon=True) + preload_pipeline_thread.start() + + # Start task schedule thread + from fooocusapi.worker import task_schedule_loop + task_schedule_thread = Thread(target=task_schedule_loop, daemon=True) + task_schedule_thread.start() # Start api server from fooocusapi.api import start_app diff --git a/predict.py b/predict.py index f98afda..ffa816b 100644 --- a/predict.py +++ b/predict.py @@ -102,7 +102,7 @@ def predict( """Run a single prediction on the model""" import modules.flags as flags from modules.sdxl_styles import legal_style_names - from fooocusapi.worker import process_generate, task_queue + from fooocusapi.worker import blocking_get_task_result, worker_queue base_model_name = default_base_model_name refiner_model_name = default_refiner_model_name @@ -178,18 +178,19 @@ def predict( outpaint_distance_left=outpaint_distance_left, outpaint_distance_top=outpaint_distance_top, outpaint_distance_right=outpaint_distance_right, - outpaint_distance_bottom=outpaint_distance_bottom + outpaint_distance_bottom=outpaint_distance_bottom, + require_base64=False, ) print(f"[Predictor Predict] Params: {params.__dict__}") - queue_task = task_queue.add_task(TaskType.text_2_img, {'params': params.__dict__, 'require_base64': False}) - if queue_task is None: + async_task = worker_queue.add_task(TaskType.text_2_img, {'params': params.__dict__, 'require_base64': False}) + if async_task is None: print("[Task Queue] The task queue has reached limit") raise Exception( f"The task queue has reached limit." ) - results = process_generate(queue_task, params) + results = blocking_get_task_result(async_task.job_id) output_paths: List[Path] = [] for r in results: