Commit bdc90837 authored by Roy Shilkrot's avatar Roy Shilkrot
Browse files

Add a barebones interrogate API

parent 737eb28f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -198,7 +198,7 @@ def prepare_enviroment():
def start_webui():
    print(f"Launching Web UI with arguments: {' '.join(sys.argv[1:])}")
    import webui
    webui.webui()
    webui.webui_or_api()


if __name__ == "__main__":
+24 −1
Original line number Diff line number Diff line
from modules.api.models import StableDiffusionTxt2ImgProcessingAPI, StableDiffusionImg2ImgProcessingAPI
from modules.api.models import StableDiffusionTxt2ImgProcessingAPI, StableDiffusionImg2ImgProcessingAPI, InterrogateAPI
from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img, process_images
from modules.sd_samplers import all_samplers
from modules.extras import run_pnginfo
@@ -25,6 +25,11 @@ class ImageToImageResponse(BaseModel):
    parameters: Json
    info: Json

class InterrogateResponse(BaseModel):
    caption: str = Field(default=None, title="Caption", description="The generated caption for the image.")
    parameters: Json
    info: Json


class Api:
    def __init__(self, app, queue_lock):
@@ -33,6 +38,7 @@ class Api:
        self.queue_lock = queue_lock
        self.app.add_api_route("/sdapi/v1/txt2img", self.text2imgapi, methods=["POST"])
        self.app.add_api_route("/sdapi/v1/img2img", self.img2imgapi, methods=["POST"])
        self.app.add_api_route("/sdapi/v1/interrogate", self.interrogateapi, methods=["POST"])

    def __base64_to_image(self, base64_string):
        # if has a comma, deal with prefix
@@ -118,6 +124,23 @@ class Api:

        return ImageToImageResponse(images=b64images, parameters=json.dumps(vars(img2imgreq)), info=processed.js())

    def interrogateapi(self, interrogatereq: InterrogateAPI):
        image_b64 = interrogatereq.image
        if image_b64 is None:
            raise HTTPException(status_code=404, detail="Image not found") 

        populate = interrogatereq.copy(update={ # Override __init__ params
            }
        )

        img = self.__base64_to_image(image_b64)

        # Override object param
        with self.queue_lock:
            processed = shared.interrogator.interrogate(img)
        
        return InterrogateResponse(caption=processed, parameters=json.dumps(vars(interrogatereq)), info=None)

    def extrasapi(self):
        raise NotImplementedError

+12 −1
Original line number Diff line number Diff line
@@ -63,7 +63,12 @@ class PydanticModelGenerator:
            
                
        self._model_name = model_name

        if class_instance is not None:
            self._class_data = merge_class_params(class_instance)
        else:
            self._class_data = {}            

        self._model_def = [
            ModelDef(
                field=underscore(k),
@@ -106,3 +111,9 @@ StableDiffusionImg2ImgProcessingAPI = PydanticModelGenerator(
    StableDiffusionProcessingImg2Img,
    [{"key": "sampler_index", "type": str, "default": "Euler"}, {"key": "init_images", "type": list, "default": None}, {"key": "denoising_strength", "type": float, "default": 0.75}, {"key": "mask", "type": str, "default": None}, {"key": "include_init_images", "type": bool, "default": False, "exclude" : True}]
).generate_model()

InterrogateAPI = PydanticModelGenerator(
    "Interrogate", 
    None,
    [{"key": "image", "type": str, "default": None}]
).generate_model()
 No newline at end of file
+8 −4
Original line number Diff line number Diff line
@@ -146,7 +146,9 @@ def webui():
        app.add_middleware(GZipMiddleware, minimum_size=1000)

        if (launch_api):
            create_api(app)
            print('launching API')
            api = create_api(app)
            api.launch(server_name="0.0.0.0" if cmd_opts.listen else "127.0.0.1", port=cmd_opts.port if cmd_opts.port else 7861)

        wait_on_server(demo)

@@ -161,10 +163,12 @@ def webui():
        print('Restarting Gradio')



task = []
if __name__ == "__main__":
def webui_or_api():
    if cmd_opts.nowebui:
        api_only()
    else:
        webui()

task = []
if __name__ == "__main__":
    webui_or_api()
 No newline at end of file