From c5539b442c010a2e2f494e5b86c059d434c131ca Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Sun, 9 Jul 2023 22:42:05 +1000 Subject: [PATCH 1/2] feat(api): set max-age for images Image files are immutable and we expect deletion to result in no further requests for a given image, so we can set the max-age to something thicc. Resolves #3426 --- invokeai/app/api/routers/images.py | 31 +++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py index a8c84b81b9..f727bd4ee2 100644 --- a/invokeai/app/api/routers/images.py +++ b/invokeai/app/api/routers/images.py @@ -1,25 +1,26 @@ import io from typing import Optional -from fastapi import Body, HTTPException, Path, Query, Request, Response, UploadFile -from fastapi.routing import APIRouter + +from fastapi import (Body, HTTPException, Path, Query, Request, Response, + UploadFile) from fastapi.responses import FileResponse +from fastapi.routing import APIRouter from PIL import Image -from invokeai.app.models.image import ( - ImageCategory, - ResourceOrigin, -) + +from invokeai.app.models.image import ImageCategory, ResourceOrigin from invokeai.app.services.image_record_storage import OffsetPaginatedResults -from invokeai.app.services.models.image_record import ( - ImageDTO, - ImageRecordChanges, - ImageUrlsDTO, -) from invokeai.app.services.item_storage import PaginatedResults +from invokeai.app.services.models.image_record import (ImageDTO, + ImageRecordChanges, + ImageUrlsDTO) from ..dependencies import ApiDependencies images_router = APIRouter(prefix="/v1/images", tags=["images"]) +# images are immutable; set a high max-age +IMAGE_MAX_AGE = 31536000 + @images_router.post( "/", @@ -141,12 +142,14 @@ async def get_image_full( if not ApiDependencies.invoker.services.images.validate_path(path): raise HTTPException(status_code=404) - return FileResponse( + response = FileResponse( path, media_type="image/png", filename=image_name, content_disposition_type="inline", ) + response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" + return response except Exception as e: raise HTTPException(status_code=404) @@ -175,9 +178,11 @@ async def get_image_thumbnail( if not ApiDependencies.invoker.services.images.validate_path(path): raise HTTPException(status_code=404) - return FileResponse( + response = FileResponse( path, media_type="image/webp", content_disposition_type="inline" ) + response.headers["Cache-Control"] = f"max-age={IMAGE_MAX_AGE}" + return response except Exception as e: raise HTTPException(status_code=404) From 23c1a6b9d5b6ca39da579b650a54a32f1c773812 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Fri, 14 Jul 2023 15:04:02 +1000 Subject: [PATCH 2/2] fix(nodes): make ResizeLatents w/h optional now you can connect to them in node editor --- invokeai/app/invocations/latent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/app/invocations/latent.py b/invokeai/app/invocations/latent.py index da99afc50f..b3f95f3658 100644 --- a/invokeai/app/invocations/latent.py +++ b/invokeai/app/invocations/latent.py @@ -519,9 +519,9 @@ class ResizeLatentsInvocation(BaseInvocation): # Inputs latents: Optional[LatentsField] = Field( description="The latents to resize") - width: int = Field( + width: Union[int, None] = Field(default=512, ge=64, multiple_of=8, description="The width to resize to (px)") - height: int = Field( + height: Union[int, None] = Field(default=512, ge=64, multiple_of=8, description="The height to resize to (px)") mode: LATENTS_INTERPOLATION_MODE = Field( default="bilinear", description="The interpolation mode")