feat: add workflows table & service

This commit is contained in:
psychedelicious
2023-10-17 17:02:15 +11:00
parent 9195c8c957
commit c2da74c587
11 changed files with 235 additions and 33 deletions

View File

@ -2,7 +2,6 @@
from __future__ import annotations
import json
import re
from abc import ABC, abstractmethod
from enum import Enum
@ -11,12 +10,13 @@ from types import UnionType
from typing import TYPE_CHECKING, Any, Callable, ClassVar, Iterable, Literal, Optional, Type, TypeVar, Union
import semver
from pydantic import BaseModel, ConfigDict, Field, create_model, field_validator
from pydantic import BaseModel, ConfigDict, Field, RootModel, TypeAdapter, create_model
from pydantic.fields import _Unset
from pydantic_core import PydanticUndefined
from invokeai.app.services.config.config_default import InvokeAIAppConfig
from invokeai.app.util.misc import uuid_string
from invokeai.app.services.workflow_records.workflow_records_common import WorkflowField
if TYPE_CHECKING:
from ..services.invocation_services import InvocationServices
@ -60,7 +60,7 @@ class FieldDescriptions:
denoised_latents = "Denoised latents tensor"
latents = "Latents tensor"
strength = "Strength of denoising (proportional to steps)"
core_metadata = "Optional core metadata to be written to image"
workflow = "Optional workflow to be saved with the image"
interp_mode = "Interpolation mode"
torch_antialias = "Whether or not to apply antialiasing (bilinear or bicubic only)"
fp32 = "Whether or not to use full float32 precision"
@ -665,27 +665,7 @@ class BaseInvocation(ABC, BaseModel):
description="Whether or not this is an intermediate invocation.",
json_schema_extra=dict(ui_type=UIType.IsIntermediate),
)
workflow: Optional[str] = Field(
default=None,
description="The workflow to save with the image",
json_schema_extra=dict(ui_type=UIType.WorkflowField),
)
use_cache: Optional[bool] = Field(
default=True,
description="Whether or not to use the cache",
)
@field_validator("workflow", mode="before")
@classmethod
def validate_workflow_is_json(cls, v):
"""We don't have a workflow schema in the backend, so we just check that it's valid JSON"""
if v is None:
return None
try:
json.loads(v)
except json.decoder.JSONDecodeError:
raise ValueError("Workflow must be valid JSON")
return v
use_cache: bool = InputField(default=True, description="Whether or not to use the cache")
UIConfig: ClassVar[Type[UIConfigBase]]
@ -824,4 +804,6 @@ def invocation_output(
return wrapper
GenericBaseModel = TypeVar("GenericBaseModel", bound=BaseModel)
class WithWorkflow(BaseModel):
workflow: Optional[WorkflowField] = InputField(default=None, description=FieldDescriptions.workflow)