fix(diffusers,vllm-omni,tinygrad): save generated images as PNG explicitly (#10729)

The image backends call PIL Image.save(request.dst) without a format, so
Pillow infers the encoder from the file extension. The core passes an
absolute staging path ending in .tmp (e.g. /staging/localai-output-*.tmp),
which Pillow can't map to a format, raising "unknown file extension: .tmp"
and crashing the worker right after a successful GPU inference.

Pass format="PNG" explicitly. LocalAI serves generated images as PNG
regardless of the temporary path, so this is always correct and no longer
depends on the extension of the destination the core happens to allocate.

diffusers is the reported backend (#10727); vllm-omni and tinygrad carry
the identical latent crash for any .tmp staging destination.

Closes #10727


Assisted-by: Claude:claude-opus-4-8 [Claude Code]

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
This commit is contained in:
LocalAI [bot]
2026-07-07 23:24:58 +02:00
committed by GitHub
parent cd65a1f645
commit 7dde5a4225
3 changed files with 15 additions and 5 deletions

View File

@@ -670,7 +670,10 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
arr = img_tensor.numpy()
image = Image.fromarray(arr)
dst = request.dst or os.path.join(tempfile.gettempdir(), "tinygrad_image.png")
image.save(dst)
# Force PNG rather than letting Pillow guess from the extension: the
# core passes a staging path ending in .tmp, which Pillow can't map
# to a format ("unknown file extension: .tmp").
image.save(dst, format="PNG")
return backend_pb2.Result(success=True, message=dst)
except Exception as exc:
import traceback