#!/usr/bin/env python # coding: utf-8 import base64 from io import BytesIO import requests import streamlit as st from PIL import Image class ServiceError(Exception): def __init__(self, status_code): self.status_code = status_code def get_images_from_backend(prompt, backend_url): r = requests.post(backend_url, json={"prompt": prompt}) if r.status_code == 200: images = r.json()["images"] images = [Image.open(BytesIO(base64.b64decode(img))) for img in images] return images else: raise ServiceError(r.status_code) st.sidebar.markdown( """

""", unsafe_allow_html=True, ) st.sidebar.markdown( """ ___

DALL·E mini is an AI model that generates images from any prompt you give!

Created by Boris Dayma et al. 2021
GitHub | Project Report

""", unsafe_allow_html=True, ) st.header("DALL·E mini") st.subheader("Generate images from text") prompt = st.text_input("What do you want to see?") DEBUG = False if prompt != "": container = st.empty() container.markdown( f"""
Predictions may take up to 40s under high load. Please stand by. """, unsafe_allow_html=True, ) try: backend_url = st.secrets["BACKEND_SERVER"] print(f"Getting selections: {prompt}") selected = get_images_from_backend(prompt, backend_url) margin = 0.1 # for better position of zoom in arrow n_columns = 3 cols = st.columns([1] + [margin, 1] * (n_columns - 1)) for i, img in enumerate(selected): cols[(i % n_columns) * 2].image(img) container.markdown(f"**{prompt}**") st.button("Again!", key="again_button") except ServiceError as error: container.text(f"Service unavailable, status: {error.status_code}") except KeyError: if DEBUG: container.markdown( """ **Error: BACKEND_SERVER unset** Please, create a file called `.streamlit/secrets.toml` inside the app's folder and include a line to configure the server URL: ``` BACKEND_SERVER="" ``` """ ) else: container.markdown( "Error -5, please try again or [report it](mailto:pcuenca-dalle@guenever.net)." )