2024-01-13 07:02:58 +00:00
|
|
|
from dataclasses import dataclass
|
|
|
|
from typing import TYPE_CHECKING, Optional
|
|
|
|
|
2024-01-14 09:16:51 +00:00
|
|
|
from deprecated import deprecated
|
2024-01-13 07:02:58 +00:00
|
|
|
from PIL.Image import Image
|
|
|
|
from torch import Tensor
|
|
|
|
|
2024-02-07 05:33:55 +00:00
|
|
|
from invokeai.app.invocations.fields import MetadataField, WithBoard, WithMetadata
|
2024-02-05 06:40:49 +00:00
|
|
|
from invokeai.app.services.boards.boards_common import BoardDTO
|
2024-01-13 07:02:58 +00:00
|
|
|
from invokeai.app.services.config.config_default import InvokeAIAppConfig
|
2024-02-07 05:33:55 +00:00
|
|
|
from invokeai.app.services.image_records.image_records_common import ImageCategory, ResourceOrigin
|
2024-01-13 07:02:58 +00:00
|
|
|
from invokeai.app.services.images.images_common import ImageDTO
|
|
|
|
from invokeai.app.services.invocation_services import InvocationServices
|
|
|
|
from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID
|
|
|
|
from invokeai.app.util.step_callback import stable_diffusion_step_callback
|
|
|
|
from invokeai.backend.model_management.model_manager import ModelInfo
|
|
|
|
from invokeai.backend.model_management.models.base import BaseModelType, ModelType, SubModelType
|
|
|
|
from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState
|
2024-01-14 23:41:25 +00:00
|
|
|
from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningFieldData
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
from invokeai.app.invocations.baseinvocation import BaseInvocation
|
|
|
|
|
|
|
|
"""
|
|
|
|
The InvocationContext provides access to various services and data about the current invocation.
|
|
|
|
|
|
|
|
We do not provide the invocation services directly, as their methods are both dangerous and
|
|
|
|
inconvenient to use.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
- The `images` service allows nodes to delete or unsafely modify existing images.
|
|
|
|
- The `configuration` service allows nodes to change the app's config at runtime.
|
|
|
|
- The `events` service allows nodes to emit arbitrary events.
|
|
|
|
|
|
|
|
Wrapping these services provides a simpler and safer interface for nodes to use.
|
|
|
|
|
|
|
|
When a node executes, a fresh `InvocationContext` is built for it, ensuring nodes cannot interfere
|
|
|
|
with each other.
|
|
|
|
|
2024-01-13 13:05:15 +00:00
|
|
|
Many of the wrappers have the same signature as the methods they wrap. This allows us to write
|
|
|
|
user-facing docstrings and not need to go and update the internal services to match.
|
|
|
|
|
2024-01-13 07:02:58 +00:00
|
|
|
Note: The docstrings are in weird places, but that's where they must be to get IDEs to see them.
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
2024-01-16 09:02:38 +00:00
|
|
|
@dataclass
|
2024-01-13 07:02:58 +00:00
|
|
|
class InvocationContextData:
|
|
|
|
invocation: "BaseInvocation"
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The invocation that is being executed."""
|
2024-01-13 07:02:58 +00:00
|
|
|
session_id: str
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The session that is being executed."""
|
2024-01-13 07:02:58 +00:00
|
|
|
queue_id: str
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The queue in which the session is being executed."""
|
2024-01-13 07:02:58 +00:00
|
|
|
source_node_id: str
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The ID of the node from which the currently executing invocation was prepared."""
|
2024-01-13 07:02:58 +00:00
|
|
|
queue_item_id: int
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The ID of the queue item that is being executed."""
|
2024-01-13 07:02:58 +00:00
|
|
|
batch_id: str
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The ID of the batch that is being executed."""
|
2024-01-13 07:02:58 +00:00
|
|
|
workflow: Optional[WorkflowWithoutID] = None
|
2024-01-13 13:05:15 +00:00
|
|
|
"""The workflow associated with this queue item, if any."""
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
class InvocationContextInterface:
|
2024-01-13 07:02:58 +00:00
|
|
|
def __init__(self, services: InvocationServices, context_data: InvocationContextData) -> None:
|
2024-02-07 03:24:05 +00:00
|
|
|
self._services = services
|
|
|
|
self._context_data = context_data
|
|
|
|
|
|
|
|
|
|
|
|
class BoardsInterface(InvocationContextInterface):
|
|
|
|
def create(self, board_name: str) -> BoardDTO:
|
|
|
|
"""
|
|
|
|
Creates a board.
|
|
|
|
|
|
|
|
:param board_name: The name of the board to create.
|
|
|
|
"""
|
|
|
|
return self._services.boards.create(board_name)
|
|
|
|
|
|
|
|
def get_dto(self, board_id: str) -> BoardDTO:
|
|
|
|
"""
|
|
|
|
Gets a board DTO.
|
|
|
|
|
|
|
|
:param board_id: The ID of the board to get.
|
|
|
|
"""
|
|
|
|
return self._services.boards.get_dto(board_id)
|
|
|
|
|
|
|
|
def get_all(self) -> list[BoardDTO]:
|
|
|
|
"""
|
|
|
|
Gets all boards.
|
|
|
|
"""
|
|
|
|
return self._services.boards.get_all()
|
|
|
|
|
|
|
|
def add_image_to_board(self, board_id: str, image_name: str) -> None:
|
|
|
|
"""
|
|
|
|
Adds an image to a board.
|
|
|
|
|
|
|
|
:param board_id: The ID of the board to add the image to.
|
|
|
|
:param image_name: The name of the image to add to the board.
|
|
|
|
"""
|
|
|
|
return self._services.board_images.add_image_to_board(board_id, image_name)
|
|
|
|
|
|
|
|
def get_all_image_names_for_board(self, board_id: str) -> list[str]:
|
|
|
|
"""
|
|
|
|
Gets all image names for a board.
|
|
|
|
|
|
|
|
:param board_id: The ID of the board to get the image names for.
|
|
|
|
"""
|
|
|
|
return self._services.board_images.get_all_board_image_names_for_board(board_id)
|
|
|
|
|
|
|
|
|
|
|
|
class LoggerInterface(InvocationContextInterface):
|
|
|
|
def debug(self, message: str) -> None:
|
|
|
|
"""
|
|
|
|
Logs a debug message.
|
|
|
|
|
|
|
|
:param message: The message to log.
|
|
|
|
"""
|
|
|
|
self._services.logger.debug(message)
|
|
|
|
|
|
|
|
def info(self, message: str) -> None:
|
|
|
|
"""
|
|
|
|
Logs an info message.
|
|
|
|
|
|
|
|
:param message: The message to log.
|
|
|
|
"""
|
|
|
|
self._services.logger.info(message)
|
|
|
|
|
|
|
|
def warning(self, message: str) -> None:
|
|
|
|
"""
|
|
|
|
Logs a warning message.
|
|
|
|
|
|
|
|
:param message: The message to log.
|
|
|
|
"""
|
|
|
|
self._services.logger.warning(message)
|
|
|
|
|
|
|
|
def error(self, message: str) -> None:
|
|
|
|
"""
|
|
|
|
Logs an error message.
|
|
|
|
|
|
|
|
:param message: The message to log.
|
|
|
|
"""
|
|
|
|
self._services.logger.error(message)
|
|
|
|
|
|
|
|
|
|
|
|
class ImagesInterface(InvocationContextInterface):
|
|
|
|
def save(
|
2024-01-13 07:02:58 +00:00
|
|
|
self,
|
2024-02-07 03:24:05 +00:00
|
|
|
image: Image,
|
|
|
|
board_id: Optional[str] = None,
|
|
|
|
image_category: ImageCategory = ImageCategory.GENERAL,
|
|
|
|
metadata: Optional[MetadataField] = None,
|
|
|
|
) -> ImageDTO:
|
|
|
|
"""
|
|
|
|
Saves an image, returning its DTO.
|
|
|
|
|
|
|
|
If the current queue item has a workflow or metadata, it is automatically saved with the image.
|
|
|
|
|
|
|
|
:param image: The image to save, as a PIL image.
|
2024-02-07 05:33:55 +00:00
|
|
|
:param board_id: The board ID to add the image to, if it should be added. It the invocation \
|
|
|
|
inherits from `WithBoard`, that board will be used automatically. **Use this only if \
|
|
|
|
you want to override or provide a board manually!**
|
2024-02-07 03:24:05 +00:00
|
|
|
:param image_category: The category of the image. Only the GENERAL category is added \
|
|
|
|
to the gallery.
|
|
|
|
:param metadata: The metadata to save with the image, if it should have any. If the \
|
|
|
|
invocation inherits from `WithMetadata`, that metadata will be used automatically. \
|
|
|
|
**Use this only if you want to override or provide metadata manually!**
|
|
|
|
"""
|
|
|
|
|
|
|
|
# If the invocation inherits metadata, use that. Else, use the metadata passed in.
|
|
|
|
metadata_ = (
|
|
|
|
self._context_data.invocation.metadata
|
|
|
|
if isinstance(self._context_data.invocation, WithMetadata)
|
|
|
|
else metadata
|
|
|
|
)
|
|
|
|
|
2024-02-07 05:33:55 +00:00
|
|
|
# If the invocation inherits WithBoard, use that. Else, use the board_id passed in.
|
|
|
|
board_ = self._context_data.invocation.board if isinstance(self._context_data.invocation, WithBoard) else None
|
|
|
|
board_id_ = board_.board_id if board_ is not None else board_id
|
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
return self._services.images.create(
|
|
|
|
image=image,
|
|
|
|
is_intermediate=self._context_data.invocation.is_intermediate,
|
|
|
|
image_category=image_category,
|
2024-02-07 05:33:55 +00:00
|
|
|
board_id=board_id_,
|
2024-02-07 03:24:05 +00:00
|
|
|
metadata=metadata_,
|
|
|
|
image_origin=ResourceOrigin.INTERNAL,
|
|
|
|
workflow=self._context_data.workflow,
|
|
|
|
session_id=self._context_data.session_id,
|
|
|
|
node_id=self._context_data.invocation.id,
|
|
|
|
)
|
|
|
|
|
|
|
|
def get_pil(self, image_name: str) -> Image:
|
|
|
|
"""
|
|
|
|
Gets an image as a PIL Image object.
|
|
|
|
|
|
|
|
:param image_name: The name of the image to get.
|
|
|
|
"""
|
|
|
|
return self._services.images.get_pil_image(image_name)
|
|
|
|
|
|
|
|
def get_metadata(self, image_name: str) -> Optional[MetadataField]:
|
|
|
|
"""
|
|
|
|
Gets an image's metadata, if it has any.
|
|
|
|
|
|
|
|
:param image_name: The name of the image to get the metadata for.
|
|
|
|
"""
|
|
|
|
return self._services.images.get_metadata(image_name)
|
|
|
|
|
|
|
|
def get_dto(self, image_name: str) -> ImageDTO:
|
|
|
|
"""
|
|
|
|
Gets an image as an ImageDTO object.
|
|
|
|
|
|
|
|
:param image_name: The name of the image to get.
|
|
|
|
"""
|
|
|
|
return self._services.images.get_dto(image_name)
|
|
|
|
|
2024-01-13 13:05:15 +00:00
|
|
|
|
2024-02-07 06:41:23 +00:00
|
|
|
class TensorsInterface(InvocationContextInterface):
|
2024-02-07 03:24:05 +00:00
|
|
|
def save(self, tensor: Tensor) -> str:
|
|
|
|
"""
|
2024-02-07 06:41:23 +00:00
|
|
|
Saves a tensor, returning its name.
|
2024-01-13 07:02:58 +00:00
|
|
|
|
2024-02-07 06:41:23 +00:00
|
|
|
:param tensor: The tensor to save.
|
2024-02-07 03:24:05 +00:00
|
|
|
"""
|
2024-01-13 07:02:58 +00:00
|
|
|
|
2024-02-07 13:23:47 +00:00
|
|
|
name = self._services.tensors.save(obj=tensor)
|
|
|
|
return name
|
2024-02-07 03:24:05 +00:00
|
|
|
|
2024-02-07 12:30:46 +00:00
|
|
|
def load(self, name: str) -> Tensor:
|
2024-02-07 03:24:05 +00:00
|
|
|
"""
|
2024-02-07 12:30:46 +00:00
|
|
|
Loads a tensor by name.
|
2024-01-13 13:05:15 +00:00
|
|
|
|
2024-02-07 12:30:46 +00:00
|
|
|
:param name: The name of the tensor to load.
|
2024-02-07 03:24:05 +00:00
|
|
|
"""
|
2024-02-07 12:30:46 +00:00
|
|
|
return self._services.tensors.load(name)
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
class ConditioningInterface(InvocationContextInterface):
|
|
|
|
def save(self, conditioning_data: ConditioningFieldData) -> str:
|
|
|
|
"""
|
|
|
|
Saves a conditioning data object, returning its name.
|
2024-01-13 07:02:58 +00:00
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
:param conditioning_context_data: The conditioning data to save.
|
|
|
|
"""
|
|
|
|
|
2024-02-07 13:23:47 +00:00
|
|
|
name = self._services.conditioning.save(obj=conditioning_data)
|
|
|
|
return name
|
2024-01-13 07:02:58 +00:00
|
|
|
|
2024-02-07 12:30:46 +00:00
|
|
|
def load(self, name: str) -> ConditioningFieldData:
|
2024-02-07 03:24:05 +00:00
|
|
|
"""
|
2024-02-07 12:30:46 +00:00
|
|
|
Loads conditioning data by name.
|
2024-02-07 03:24:05 +00:00
|
|
|
|
2024-02-07 12:30:46 +00:00
|
|
|
:param name: The name of the conditioning data to load.
|
2024-02-07 03:24:05 +00:00
|
|
|
"""
|
2024-01-13 13:05:15 +00:00
|
|
|
|
2024-02-07 12:30:46 +00:00
|
|
|
return self._services.conditioning.load(name)
|
2024-02-07 03:24:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
class ModelsInterface(InvocationContextInterface):
|
|
|
|
def exists(self, model_name: str, base_model: BaseModelType, model_type: ModelType) -> bool:
|
|
|
|
"""
|
|
|
|
Checks if a model exists.
|
|
|
|
|
|
|
|
:param model_name: The name of the model to check.
|
|
|
|
:param base_model: The base model of the model to check.
|
|
|
|
:param model_type: The type of the model to check.
|
|
|
|
"""
|
|
|
|
return self._services.model_manager.model_exists(model_name, base_model, model_type)
|
|
|
|
|
|
|
|
def load(
|
|
|
|
self, model_name: str, base_model: BaseModelType, model_type: ModelType, submodel: Optional[SubModelType] = None
|
|
|
|
) -> ModelInfo:
|
|
|
|
"""
|
|
|
|
Loads a model, returning its `ModelInfo` object.
|
|
|
|
|
|
|
|
:param model_name: The name of the model to get.
|
|
|
|
:param base_model: The base model of the model to get.
|
|
|
|
:param model_type: The type of the model to get.
|
|
|
|
:param submodel: The submodel of the model to get.
|
|
|
|
"""
|
|
|
|
|
2024-02-07 23:57:01 +00:00
|
|
|
# The model manager emits events as it loads the model. It needs the context data to build
|
|
|
|
# the event payloads.
|
2024-02-07 03:24:05 +00:00
|
|
|
|
|
|
|
return self._services.model_manager.get_model(
|
|
|
|
model_name, base_model, model_type, submodel, context_data=self._context_data
|
|
|
|
)
|
|
|
|
|
|
|
|
def get_info(self, model_name: str, base_model: BaseModelType, model_type: ModelType) -> dict:
|
|
|
|
"""
|
|
|
|
Gets a model's info, an dict-like object.
|
|
|
|
|
|
|
|
:param model_name: The name of the model to get.
|
|
|
|
:param base_model: The base model of the model to get.
|
|
|
|
:param model_type: The type of the model to get.
|
|
|
|
"""
|
|
|
|
return self._services.model_manager.model_info(model_name, base_model, model_type)
|
|
|
|
|
|
|
|
|
|
|
|
class ConfigInterface(InvocationContextInterface):
|
|
|
|
def get(self) -> InvokeAIAppConfig:
|
2024-02-07 04:58:46 +00:00
|
|
|
"""Gets the app's config."""
|
2024-02-07 03:24:05 +00:00
|
|
|
|
2024-02-07 04:58:46 +00:00
|
|
|
return self._services.configuration.get_config()
|
2024-02-07 03:24:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
class UtilInterface(InvocationContextInterface):
|
|
|
|
def sd_step_callback(self, intermediate_state: PipelineIntermediateState, base_model: BaseModelType) -> None:
|
|
|
|
"""
|
|
|
|
The step callback emits a progress event with the current step, the total number of
|
|
|
|
steps, a preview image, and some other internal metadata.
|
|
|
|
|
|
|
|
This should be called after each denoising step.
|
|
|
|
|
|
|
|
:param intermediate_state: The intermediate state of the diffusion pipeline.
|
|
|
|
:param base_model: The base model for the current denoising step.
|
|
|
|
"""
|
2024-01-13 13:05:15 +00:00
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
# The step callback needs access to the events and the invocation queue services, but this
|
|
|
|
# represents a dangerous level of access.
|
|
|
|
#
|
|
|
|
# We wrap the step callback so that nodes do not have direct access to these services.
|
2024-01-13 07:02:58 +00:00
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
stable_diffusion_step_callback(
|
|
|
|
context_data=self._context_data,
|
|
|
|
intermediate_state=intermediate_state,
|
|
|
|
base_model=base_model,
|
|
|
|
invocation_queue=self._services.queue,
|
|
|
|
events=self._services.events,
|
|
|
|
)
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
|
2024-01-14 09:16:51 +00:00
|
|
|
deprecation_version = "3.7.0"
|
|
|
|
removed_version = "3.8.0"
|
|
|
|
|
|
|
|
|
|
|
|
def get_deprecation_reason(property_name: str, alternative: Optional[str] = None) -> str:
|
|
|
|
msg = f"{property_name} is deprecated as of v{deprecation_version}. It will be removed in v{removed_version}."
|
|
|
|
if alternative is not None:
|
|
|
|
msg += f" Use {alternative} instead."
|
|
|
|
msg += " See PLACEHOLDER_URL for details."
|
|
|
|
return msg
|
|
|
|
|
|
|
|
|
|
|
|
# Deprecation docstrings template. I don't think we can implement these programmatically with
|
|
|
|
# __doc__ because the IDE won't see them.
|
|
|
|
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
|
|
|
PROPERTY_NAME will be removed in v3.8.0. Use ALTERNATIVE instead. See PLACEHOLDER_URL for details.
|
|
|
|
|
|
|
|
OG_DOCSTRING
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
2024-01-13 07:02:58 +00:00
|
|
|
class InvocationContext:
|
|
|
|
"""
|
2024-01-13 13:05:15 +00:00
|
|
|
The `InvocationContext` provides access to various services and data for the current invocation.
|
2024-01-13 07:02:58 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
images: ImagesInterface,
|
2024-02-07 06:41:23 +00:00
|
|
|
tensors: TensorsInterface,
|
2024-01-13 13:05:15 +00:00
|
|
|
conditioning: ConditioningInterface,
|
2024-01-13 07:02:58 +00:00
|
|
|
models: ModelsInterface,
|
|
|
|
logger: LoggerInterface,
|
2024-01-13 13:05:15 +00:00
|
|
|
config: ConfigInterface,
|
2024-01-13 07:02:58 +00:00
|
|
|
util: UtilInterface,
|
2024-02-05 06:40:49 +00:00
|
|
|
boards: BoardsInterface,
|
2024-02-07 03:39:26 +00:00
|
|
|
context_data: InvocationContextData,
|
2024-01-14 09:16:51 +00:00
|
|
|
services: InvocationServices,
|
2024-01-13 07:02:58 +00:00
|
|
|
) -> None:
|
|
|
|
self.images = images
|
2024-01-13 13:05:15 +00:00
|
|
|
"""Provides methods to save, get and update images and their metadata."""
|
2024-02-07 06:41:23 +00:00
|
|
|
self.tensors = tensors
|
|
|
|
"""Provides methods to save and get tensors, including image, noise, masks, and masked images."""
|
2024-01-13 07:02:58 +00:00
|
|
|
self.conditioning = conditioning
|
2024-01-13 13:05:15 +00:00
|
|
|
"""Provides methods to save and get conditioning data."""
|
2024-01-13 07:02:58 +00:00
|
|
|
self.models = models
|
2024-01-13 13:05:15 +00:00
|
|
|
"""Provides methods to check if a model exists, get a model, and get a model's info."""
|
|
|
|
self.logger = logger
|
|
|
|
"""Provides access to the app logger."""
|
2024-01-13 07:02:58 +00:00
|
|
|
self.config = config
|
2024-01-13 13:05:15 +00:00
|
|
|
"""Provides access to the app's config."""
|
2024-01-13 07:02:58 +00:00
|
|
|
self.util = util
|
2024-01-13 13:05:15 +00:00
|
|
|
"""Provides utility methods."""
|
2024-02-05 06:40:49 +00:00
|
|
|
self.boards = boards
|
|
|
|
"""Provides methods to interact with boards."""
|
2024-02-07 03:39:26 +00:00
|
|
|
self._data = context_data
|
|
|
|
"""Provides data about the current queue item and invocation. This is an internal API and may change without warning."""
|
2024-02-07 03:36:42 +00:00
|
|
|
self._services = services
|
|
|
|
"""Provides access to the full application services. This is an internal API and may change without warning."""
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
@deprecated(version=deprecation_version, reason=get_deprecation_reason("`context.services`"))
|
|
|
|
def services(self) -> InvocationServices:
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
|
|
|
`context.services` will be removed in v3.8.0. See PLACEHOLDER_URL for details.
|
|
|
|
|
|
|
|
The invocation services.
|
|
|
|
"""
|
2024-02-07 03:36:42 +00:00
|
|
|
return self._services
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
@deprecated(
|
|
|
|
version=deprecation_version,
|
2024-02-07 03:39:26 +00:00
|
|
|
reason=get_deprecation_reason("`context.graph_execution_state_id", "`context._data.session_id`"),
|
2024-01-14 09:16:51 +00:00
|
|
|
)
|
|
|
|
def graph_execution_state_id(self) -> str:
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
2024-02-07 03:39:26 +00:00
|
|
|
`context.graph_execution_state_api` will be removed in v3.8.0. Use `context._data.session_id` instead. See PLACEHOLDER_URL for details.
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
The ID of the session (aka graph execution state).
|
|
|
|
"""
|
2024-02-07 03:39:26 +00:00
|
|
|
return self._data.session_id
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
@deprecated(
|
|
|
|
version=deprecation_version,
|
2024-02-07 03:39:26 +00:00
|
|
|
reason=get_deprecation_reason("`context.queue_id`", "`context._data.queue_id`"),
|
2024-01-14 09:16:51 +00:00
|
|
|
)
|
|
|
|
def queue_id(self) -> str:
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
2024-02-07 03:39:26 +00:00
|
|
|
`context.queue_id` will be removed in v3.8.0. Use `context._data.queue_id` instead. See PLACEHOLDER_URL for details.
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
The ID of the queue.
|
|
|
|
"""
|
2024-02-07 03:39:26 +00:00
|
|
|
return self._data.queue_id
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
@deprecated(
|
|
|
|
version=deprecation_version,
|
2024-02-07 03:39:26 +00:00
|
|
|
reason=get_deprecation_reason("`context.queue_item_id`", "`context._data.queue_item_id`"),
|
2024-01-14 09:16:51 +00:00
|
|
|
)
|
|
|
|
def queue_item_id(self) -> int:
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
2024-02-07 03:39:26 +00:00
|
|
|
`context.queue_item_id` will be removed in v3.8.0. Use `context._data.queue_item_id` instead. See PLACEHOLDER_URL for details.
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
The ID of the queue item.
|
|
|
|
"""
|
2024-02-07 03:39:26 +00:00
|
|
|
return self._data.queue_item_id
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
@deprecated(
|
|
|
|
version=deprecation_version,
|
2024-02-07 03:39:26 +00:00
|
|
|
reason=get_deprecation_reason("`context.queue_batch_id`", "`context._data.batch_id`"),
|
2024-01-14 09:16:51 +00:00
|
|
|
)
|
|
|
|
def queue_batch_id(self) -> str:
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
2024-02-07 03:39:26 +00:00
|
|
|
`context.queue_batch_id` will be removed in v3.8.0. Use `context._data.batch_id` instead. See PLACEHOLDER_URL for details.
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
The ID of the batch.
|
|
|
|
"""
|
2024-02-07 03:39:26 +00:00
|
|
|
return self._data.batch_id
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
@deprecated(
|
|
|
|
version=deprecation_version,
|
2024-02-07 03:39:26 +00:00
|
|
|
reason=get_deprecation_reason("`context.workflow`", "`context._data.workflow`"),
|
2024-01-14 09:16:51 +00:00
|
|
|
)
|
|
|
|
def workflow(self) -> Optional[WorkflowWithoutID]:
|
|
|
|
"""
|
|
|
|
**DEPRECATED as of v3.7.0**
|
|
|
|
|
2024-02-07 03:39:26 +00:00
|
|
|
`context.workflow` will be removed in v3.8.0. Use `context._data.workflow` instead. See PLACEHOLDER_URL for details.
|
2024-01-14 09:16:51 +00:00
|
|
|
|
|
|
|
The workflow associated with this queue item, if any.
|
|
|
|
"""
|
2024-02-07 03:39:26 +00:00
|
|
|
return self._data.workflow
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
def build_invocation_context(
|
|
|
|
services: InvocationServices,
|
|
|
|
context_data: InvocationContextData,
|
|
|
|
) -> InvocationContext:
|
|
|
|
"""
|
2024-01-13 13:05:15 +00:00
|
|
|
Builds the invocation context for a specific invocation execution.
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
:param invocation_services: The invocation services to wrap.
|
|
|
|
:param invocation_context_data: The invocation context data.
|
|
|
|
"""
|
|
|
|
|
2024-02-07 03:24:05 +00:00
|
|
|
logger = LoggerInterface(services=services, context_data=context_data)
|
2024-01-13 07:02:58 +00:00
|
|
|
images = ImagesInterface(services=services, context_data=context_data)
|
2024-02-07 06:41:23 +00:00
|
|
|
tensors = TensorsInterface(services=services, context_data=context_data)
|
2024-01-13 07:02:58 +00:00
|
|
|
models = ModelsInterface(services=services, context_data=context_data)
|
2024-02-07 03:24:05 +00:00
|
|
|
config = ConfigInterface(services=services, context_data=context_data)
|
2024-01-13 07:02:58 +00:00
|
|
|
util = UtilInterface(services=services, context_data=context_data)
|
|
|
|
conditioning = ConditioningInterface(services=services, context_data=context_data)
|
2024-02-07 03:24:05 +00:00
|
|
|
boards = BoardsInterface(services=services, context_data=context_data)
|
2024-01-13 07:02:58 +00:00
|
|
|
|
|
|
|
ctx = InvocationContext(
|
|
|
|
images=images,
|
|
|
|
logger=logger,
|
|
|
|
config=config,
|
2024-02-07 06:41:23 +00:00
|
|
|
tensors=tensors,
|
2024-01-13 07:02:58 +00:00
|
|
|
models=models,
|
2024-02-07 03:39:26 +00:00
|
|
|
context_data=context_data,
|
2024-01-13 07:02:58 +00:00
|
|
|
util=util,
|
|
|
|
conditioning=conditioning,
|
2024-01-14 09:16:51 +00:00
|
|
|
services=services,
|
2024-02-05 06:40:49 +00:00
|
|
|
boards=boards,
|
2024-01-13 07:02:58 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
return ctx
|