Spaces:
Running
Running
import base64 | |
from PIL import Image as PILImage | |
from pydantic import BaseModel | |
from langflow.services.deps import get_storage_service | |
IMAGE_ENDPOINT = "/files/images/" | |
def is_image_file(file_path) -> bool: | |
try: | |
with PILImage.open(file_path) as img: | |
img.verify() # Verify that it is, in fact, an image | |
except (OSError, SyntaxError): | |
return False | |
return True | |
def get_file_paths(files: list[str]): | |
storage_service = get_storage_service() | |
file_paths = [] | |
for file in files: | |
flow_id, file_name = file.split("/") | |
file_paths.append(storage_service.build_full_path(flow_id=flow_id, file_name=file_name)) | |
return file_paths | |
async def get_files( | |
file_paths: list[str], | |
*, | |
convert_to_base64: bool = False, | |
): | |
storage_service = get_storage_service() | |
file_objects: list[str | bytes] = [] | |
for file_path in file_paths: | |
flow_id, file_name = file_path.split("/") | |
file_object = await storage_service.get_file(flow_id=flow_id, file_name=file_name) | |
if convert_to_base64: | |
file_base64 = base64.b64encode(file_object).decode("utf-8") | |
file_objects.append(file_base64) | |
else: | |
file_objects.append(file_object) | |
return file_objects | |
class Image(BaseModel): | |
path: str | None = None | |
url: str | None = None | |
def to_base64(self): | |
if self.path: | |
files = get_files([self.path], convert_to_base64=True) | |
return files[0] | |
msg = "Image path is not set." | |
raise ValueError(msg) | |
def to_content_dict(self): | |
return { | |
"type": "image_url", | |
"image_url": self.to_base64(), | |
} | |
def get_url(self) -> str: | |
return f"{IMAGE_ENDPOINT}{self.path}" | |