You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
6.1 KiB
Python
254 lines
6.1 KiB
Python
import base64
|
|
import io
|
|
from enum import StrEnum
|
|
from typing import Annotated, List, Optional
|
|
|
|
from pydantic import AnyUrl, BaseModel, EmailStr, confloat, conint, constr, validator
|
|
|
|
|
|
class Type(StrEnum):
|
|
AUDIO = "AUDIO"
|
|
CLASSIFICATION = "CLASSIFICATION"
|
|
PICTURE = "PICTURE"
|
|
STORAGE = "STORAGE"
|
|
TEXT = "TEXT"
|
|
VIDEO = "VIDEO"
|
|
|
|
|
|
class Engine(BaseModel):
|
|
description: str
|
|
id: str
|
|
name: str
|
|
type: Type
|
|
|
|
|
|
class Error(BaseModel):
|
|
id: str
|
|
name: str
|
|
message: str
|
|
|
|
|
|
CfgScale = Annotated[float, confloat(ge=0.0, le=35.0)]
|
|
|
|
|
|
class ClipGuidancePreset(StrEnum):
|
|
FAST_BLUE = "FAST_BLUE"
|
|
FAST_GREEN = "FAST_GREEN"
|
|
NONE = "NONE"
|
|
SIMPLE = "SIMPLE"
|
|
SLOW = "SLOW"
|
|
SLOWER = "SLOWER"
|
|
SLOWEST = "SLOWEST"
|
|
|
|
|
|
UpscaleImageHeight = Annotated[int, conint(ge=512)]
|
|
|
|
UpscaleImageWidth = Annotated[int, conint(ge=512)]
|
|
|
|
DiffuseImageHeight = Annotated[int, conint(ge=128, multiple_of=64)]
|
|
|
|
DiffuseImageWidth = Annotated[int, conint(ge=128, multiple_of=64)]
|
|
|
|
|
|
class Sampler(StrEnum):
|
|
DDIM = "DDIM"
|
|
DDPM = "DDPM"
|
|
K_DPMPP_2M = "K_DPMPP_2M"
|
|
K_DPMPP_2S_ANCESTRAL = "K_DPMPP_2S_ANCESTRAL"
|
|
K_DPM_2 = "K_DPM_2"
|
|
K_DPM_2_ANCESTRAL = "K_DPM_2_ANCESTRAL"
|
|
K_EULER = "K_EULER"
|
|
K_EULER_ANCESTRAL = "K_EULER_ANCESTRAL"
|
|
K_HEUN = "K_HEUN"
|
|
K_LMS = "K_LMS"
|
|
|
|
|
|
Samples = Annotated[int, conint(ge=1, le=10)]
|
|
|
|
Seed = Annotated[int, conint(ge=0, le=4294967295)]
|
|
|
|
Steps = Annotated[int, conint(ge=10, le=150)]
|
|
|
|
Extras = dict
|
|
|
|
|
|
class StylePreset(StrEnum):
|
|
enhance = "enhance"
|
|
anime = "anime"
|
|
photographic = "photographic"
|
|
digital_art = "digital-art"
|
|
comic_book = "comic-book"
|
|
fantasy_art = "fantasy-art"
|
|
line_art = "line-art"
|
|
analog_film = "analog-film"
|
|
neon_punk = "neon-punk"
|
|
isometric = "isometric"
|
|
low_poly = "low-poly"
|
|
origami = "origami"
|
|
modeling_compound = "modeling-compound"
|
|
cinematic = "cinematic"
|
|
field_3d_model = "3d-model"
|
|
pixel_art = "pixel-art"
|
|
tile_texture = "tile-texture"
|
|
|
|
|
|
class TextPrompt(BaseModel):
|
|
text: Annotated[str, constr(max_length=2000)]
|
|
weight: Optional[float] = None
|
|
|
|
|
|
SingleTextPrompt = str
|
|
|
|
TextPrompts = List[TextPrompt]
|
|
|
|
InitImage = io.IOBase
|
|
|
|
InitImageStrength = Annotated[float, confloat(ge=0.0, le=1.0)]
|
|
|
|
|
|
class InitImageMode(StrEnum):
|
|
IMAGE_STRENGTH = "IMAGE_STRENGTH"
|
|
STEP_SCHEDULE = "STEP_SCHEDULE"
|
|
|
|
|
|
StepScheduleStart = Annotated[float, confloat(ge=0.0, le=1.0)]
|
|
|
|
StepScheduleEnd = Annotated[float, confloat(ge=0.0, le=1.0)]
|
|
|
|
MaskImage = bytes
|
|
|
|
MaskSource = str
|
|
|
|
|
|
class GenerationRequestOptionalParams(BaseModel):
|
|
cfg_scale: Optional[CfgScale] = None
|
|
clip_guidance_preset: Optional[ClipGuidancePreset] = None
|
|
sampler: Optional[Sampler] = None
|
|
samples: Optional[Samples] = None
|
|
seed: Optional[Seed] = None
|
|
steps: Optional[Steps] = None
|
|
style_preset: Optional[StylePreset] = None
|
|
extras: Optional[Extras] = None
|
|
|
|
|
|
class LatentUpscalerUpscaleRequestBody(BaseModel):
|
|
image: InitImage
|
|
width: Optional[UpscaleImageWidth] = None
|
|
height: Optional[UpscaleImageHeight] = None
|
|
text_prompts: Optional[TextPrompts] = None
|
|
seed: Optional[Seed] = None
|
|
steps: Optional[Steps] = None
|
|
cfg_scale: Optional[CfgScale] = None
|
|
|
|
class Config:
|
|
arbitrary_types_allowed = True
|
|
|
|
|
|
class ImageToImageRequestBody(BaseModel):
|
|
text_prompts: TextPrompts
|
|
init_image: InitImage
|
|
init_image_mode: Optional[InitImageMode] = InitImageMode("IMAGE_STRENGTH")
|
|
image_strength: Optional[InitImageStrength] = None
|
|
step_schedule_start: Optional[StepScheduleStart] = None
|
|
step_schedule_end: Optional[StepScheduleEnd] = None
|
|
cfg_scale: Optional[CfgScale] = None
|
|
clip_guidance_preset: Optional[ClipGuidancePreset] = None
|
|
sampler: Optional[Sampler] = None
|
|
samples: Optional[Samples] = None
|
|
seed: Optional[Seed] = None
|
|
steps: Optional[Steps] = None
|
|
style_preset: Optional[StylePreset] = None
|
|
extras: Optional[Extras] = None
|
|
|
|
class Config:
|
|
arbitrary_types_allowed = True
|
|
|
|
|
|
class MaskingRequestBody(BaseModel):
|
|
init_image: InitImage
|
|
mask_source: MaskSource
|
|
mask_image: Optional[MaskImage] = None
|
|
text_prompts: TextPrompts
|
|
cfg_scale: Optional[CfgScale] = None
|
|
clip_guidance_preset: Optional[ClipGuidancePreset] = None
|
|
sampler: Optional[Sampler] = None
|
|
samples: Optional[Samples] = None
|
|
seed: Optional[Seed] = None
|
|
steps: Optional[Steps] = None
|
|
style_preset: Optional[StylePreset] = None
|
|
extras: Optional[Extras] = None
|
|
|
|
class Config:
|
|
arbitrary_types_allowed = True
|
|
|
|
|
|
class TextToImageRequestBody(GenerationRequestOptionalParams):
|
|
height: Optional[DiffuseImageHeight] = None
|
|
width: Optional[DiffuseImageWidth] = None
|
|
text_prompts: TextPrompts
|
|
|
|
|
|
class ImageToImageUpscaleRequestBody(BaseModel):
|
|
image: InitImage
|
|
width: Optional[UpscaleImageWidth] = None
|
|
height: Optional[UpscaleImageHeight] = None
|
|
|
|
@validator("width", always=True)
|
|
def mutually_exclusive(cls, v, values):
|
|
if values.get("height") is not None and v:
|
|
raise ValueError("You can only specify one of width and height.")
|
|
return v
|
|
|
|
class Config:
|
|
arbitrary_types_allowed = True
|
|
|
|
|
|
class BalanceResponseBody(BaseModel):
|
|
credits: float
|
|
|
|
|
|
ListEnginesResponseBody = List[Engine]
|
|
|
|
|
|
class FinishReason(StrEnum):
|
|
SUCCESS = "SUCCESS"
|
|
ERROR = "ERROR"
|
|
CONTENT_FILTERED = "CONTENT_FILTERED"
|
|
|
|
|
|
class Image(BaseModel):
|
|
base64: Optional[str] = None
|
|
finishReason: Optional[FinishReason] = None
|
|
seed: Optional[float] = None
|
|
|
|
@property
|
|
def file(self):
|
|
assert self.base64 is not None
|
|
return io.BytesIO(base64.b64decode(self.base64))
|
|
|
|
|
|
class OrganizationMembership(BaseModel):
|
|
id: str
|
|
is_default: bool
|
|
name: str
|
|
role: str
|
|
|
|
|
|
class AccountResponseBody(BaseModel):
|
|
email: EmailStr
|
|
id: str
|
|
organizations: List[OrganizationMembership]
|
|
profile_picture: Optional[AnyUrl] = None
|
|
|
|
|
|
class TextToImageResponseBody(BaseModel):
|
|
artifacts: List[Image]
|
|
|
|
|
|
class ImageToImageResponseBody(BaseModel):
|
|
artifacts: List[Image]
|
|
|
|
|
|
class ImageToImageUpscaleResponseBody(BaseModel):
|
|
artifacts: List[Image]
|