Spaces:
Running on Zero
Running on Zero
Serve lightweight previews and use the Python server directly
Browse files
app.py
CHANGED
|
@@ -105,12 +105,13 @@ def make_session(image: Image.Image, example: str | None = None):
|
|
| 105 |
directory = RUNTIME / sid
|
| 106 |
directory.mkdir()
|
| 107 |
image.save(directory / "source.png")
|
|
|
|
| 108 |
SESSIONS[sid] = {
|
| 109 |
"directory": directory, "size": image.size, "example": example,
|
| 110 |
"touched": time.monotonic(), "job": None,
|
| 111 |
}
|
| 112 |
return {"id": sid, "width": image.width, "height": image.height,
|
| 113 |
-
"image": f"/api/sessions/{sid}/
|
| 114 |
|
| 115 |
|
| 116 |
def update_job(jid: str, **values):
|
|
@@ -258,6 +259,7 @@ def refine(session, jid, request: RefineRequest, progress_report=None):
|
|
| 258 |
sample_id="studio", progress_callback=progress)
|
| 259 |
report(message="Preparing region comparisons", progress=0.97)
|
| 260 |
result.image.save(directory / f"{jid}.png")
|
|
|
|
| 261 |
crops = []
|
| 262 |
with Image.open(directory / "source.png") as before:
|
| 263 |
for i, row in enumerate(rows):
|
|
@@ -266,13 +268,13 @@ def refine(session, jid, request: RefineRequest, progress_report=None):
|
|
| 266 |
box = (max(0, math.floor(x0 - padding)), max(0, math.floor(y0 - padding)),
|
| 267 |
min(before.width, math.ceil(x1 + padding)), min(before.height, math.ceil(y1 + padding)))
|
| 268 |
for label, image in (("before", before), ("after", result.image)):
|
| 269 |
-
image.crop(box).save(directory / f"{jid}-{i}-{label}.
|
| 270 |
crops.append({"id": row.id, "text": row.text, "bbox": row.bbox,
|
| 271 |
-
"before": f"{jid}-{i}-before.
|
| 272 |
metadata = {"regions": [row.model_dump() for row in rows], "model": request.variant,
|
| 273 |
"steps": request.steps, "seed": request.seed, "guidance": request.guidance}
|
| 274 |
(directory / f"{jid}.json").write_text(json.dumps(metadata, ensure_ascii=False, indent=2))
|
| 275 |
-
return {**metadata, "image": f"{jid}.png", "regions": crops, "metadata": f"{jid}.json"}
|
| 276 |
|
| 277 |
|
| 278 |
@app.get("/")
|
|
@@ -367,7 +369,7 @@ def job(sid: str, jid: str):
|
|
| 367 |
def session_file(sid: str, filename: str):
|
| 368 |
session = session_for(sid)
|
| 369 |
# File names are server-generated. A session cannot address another session's data.
|
| 370 |
-
if Path(filename).name != filename or not filename.endswith((".png", ".json")):
|
| 371 |
raise HTTPException(404, "File not found")
|
| 372 |
path = session["directory"] / filename
|
| 373 |
if not path.is_file():
|
|
|
|
| 105 |
directory = RUNTIME / sid
|
| 106 |
directory.mkdir()
|
| 107 |
image.save(directory / "source.png")
|
| 108 |
+
image.save(directory / "preview.webp", quality=94, method=4)
|
| 109 |
SESSIONS[sid] = {
|
| 110 |
"directory": directory, "size": image.size, "example": example,
|
| 111 |
"touched": time.monotonic(), "job": None,
|
| 112 |
}
|
| 113 |
return {"id": sid, "width": image.width, "height": image.height,
|
| 114 |
+
"image": f"/api/sessions/{sid}/preview.webp", "example": example}
|
| 115 |
|
| 116 |
|
| 117 |
def update_job(jid: str, **values):
|
|
|
|
| 259 |
sample_id="studio", progress_callback=progress)
|
| 260 |
report(message="Preparing region comparisons", progress=0.97)
|
| 261 |
result.image.save(directory / f"{jid}.png")
|
| 262 |
+
result.image.save(directory / f"{jid}.webp", quality=94, method=4)
|
| 263 |
crops = []
|
| 264 |
with Image.open(directory / "source.png") as before:
|
| 265 |
for i, row in enumerate(rows):
|
|
|
|
| 268 |
box = (max(0, math.floor(x0 - padding)), max(0, math.floor(y0 - padding)),
|
| 269 |
min(before.width, math.ceil(x1 + padding)), min(before.height, math.ceil(y1 + padding)))
|
| 270 |
for label, image in (("before", before), ("after", result.image)):
|
| 271 |
+
image.crop(box).save(directory / f"{jid}-{i}-{label}.webp", quality=96, method=4)
|
| 272 |
crops.append({"id": row.id, "text": row.text, "bbox": row.bbox,
|
| 273 |
+
"before": f"{jid}-{i}-before.webp", "after": f"{jid}-{i}-after.webp"})
|
| 274 |
metadata = {"regions": [row.model_dump() for row in rows], "model": request.variant,
|
| 275 |
"steps": request.steps, "seed": request.seed, "guidance": request.guidance}
|
| 276 |
(directory / f"{jid}.json").write_text(json.dumps(metadata, ensure_ascii=False, indent=2))
|
| 277 |
+
return {**metadata, "image": f"{jid}.png", "preview": f"{jid}.webp", "regions": crops, "metadata": f"{jid}.json"}
|
| 278 |
|
| 279 |
|
| 280 |
@app.get("/")
|
|
|
|
| 369 |
def session_file(sid: str, filename: str):
|
| 370 |
session = session_for(sid)
|
| 371 |
# File names are server-generated. A session cannot address another session's data.
|
| 372 |
+
if Path(filename).name != filename or not filename.endswith((".png", ".webp", ".json")):
|
| 373 |
raise HTTPException(404, "File not found")
|
| 374 |
path = session["directory"] / filename
|
| 375 |
if not path.is_file():
|
space.py
CHANGED
|
@@ -91,4 +91,4 @@ def refine_image(sid: str, payload: str) -> dict:
|
|
| 91 |
|
| 92 |
if __name__ == "__main__":
|
| 93 |
studio.app.launch(server_name=os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0"),
|
| 94 |
-
server_port=int(os.environ.get("PIXTEXT_PORT", "7860")), show_error=False)
|
|
|
|
| 91 |
|
| 92 |
if __name__ == "__main__":
|
| 93 |
studio.app.launch(server_name=os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0"),
|
| 94 |
+
server_port=int(os.environ.get("PIXTEXT_PORT", "7860")), show_error=False, ssr_mode=False)
|