Skip to content

async_

AlchemyAsyncResponse

Bases: HordeResponseBaseModel, JobResponseMixin, ResponseRequiringFollowUpMixin, ContainsMessageResponseMixin

Represents the data returned from the /v2/interrogate/async endpoint with http status code 202.

v2 API Model: RequestInterrogationResponse

Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
class AlchemyAsyncResponse(
    HordeResponseBaseModel,
    JobResponseMixin,
    ResponseRequiringFollowUpMixin,
    ContainsMessageResponseMixin,
):
    """Represents the data returned from the /v2/interrogate/async endpoint with http status code 202.

    v2 API Model: `RequestInterrogationResponse`
    """

    @override
    @classmethod
    def get_api_model_name(cls) -> str | None:
        return "RequestInterrogationResponse"

    @override
    def get_follow_up_returned_params(self, *, as_python_field_name: bool = False) -> list[dict[str, object]]:
        if as_python_field_name:
            return [{"id_": self.id_}]
        return [{AIHordePathData.id_: self.id_}]

    @override
    @classmethod
    def get_follow_up_default_request_type(cls) -> type[AlchemyStatusRequest]:
        return AlchemyStatusRequest

    @override
    @classmethod
    def get_follow_up_request_types(  # type: ignore[override]
        cls,
    ) -> list[type[AlchemyStatusRequest]]:
        return [AlchemyStatusRequest]

    @override
    @classmethod
    def get_follow_up_failure_cleanup_request_type(cls) -> type[AlchemyDeleteRequest]:
        return AlchemyDeleteRequest

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

message class-attribute instance-attribute

message: str = ''

A message from the API. This is typically an error or warning message, but may also be informational.

id_ class-attribute instance-attribute

id_: GenerationID = Field(alias='id')

The UUID for this job.

time_constructed property

time_constructed: float

The time the model was constructed (in epoch time).

get_api_model_name classmethod

get_api_model_name() -> str | None
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_api_model_name(cls) -> str | None:
    return "RequestInterrogationResponse"

get_follow_up_returned_params

get_follow_up_returned_params(
    *, as_python_field_name: bool = False
) -> list[dict[str, object]]
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
def get_follow_up_returned_params(self, *, as_python_field_name: bool = False) -> list[dict[str, object]]:
    if as_python_field_name:
        return [{"id_": self.id_}]
    return [{AIHordePathData.id_: self.id_}]

get_follow_up_default_request_type classmethod

get_follow_up_default_request_type() -> (
    type[AlchemyStatusRequest]
)
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_follow_up_default_request_type(cls) -> type[AlchemyStatusRequest]:
    return AlchemyStatusRequest

get_follow_up_request_types classmethod

get_follow_up_request_types() -> (
    list[type[AlchemyStatusRequest]]
)
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_follow_up_request_types(  # type: ignore[override]
    cls,
) -> list[type[AlchemyStatusRequest]]:
    return [AlchemyStatusRequest]

get_follow_up_failure_cleanup_request_type classmethod

get_follow_up_failure_cleanup_request_type() -> (
    type[AlchemyDeleteRequest]
)
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_follow_up_failure_cleanup_request_type(cls) -> type[AlchemyDeleteRequest]:
    return AlchemyDeleteRequest

get_follow_up_extra_params

get_follow_up_extra_params() -> dict[str, object]

Return any additional information required from this response to submit a follow up request.

Source code in horde_sdk/generic_api/apimodels.py
def get_follow_up_extra_params(self) -> dict[str, object]:
    """Return any additional information required from this response to submit a follow up request."""
    logger.warning("This method may be deprecated in the future.")
    return {}  # TODO: Would extra params need to come into play for a list of follow up requests?

get_follow_up_all_params

get_follow_up_all_params() -> list[dict[str, object]]

Return the required inf from this response to submit any follow up requests warranted from this response.

Note that this dict uses the alias field names (as seen on the API), not the python field names.

get_follow_up_failure_cleanup_params is not included.

This is used for context management.

Returns:

  • list[dict[str, object]]

    list[dict[str, object]]: A list of dicts of parameter names and values for each follow up request.

Source code in horde_sdk/generic_api/apimodels.py
def get_follow_up_all_params(self) -> list[dict[str, object]]:
    """Return the required inf from this response to submit any follow up requests warranted from this response.

    Note that this dict uses the alias field names (as seen on the API), not the python field names.

    `get_follow_up_failure_cleanup_params` is **not** included.

    This is used for context management.

    Returns:
        list[dict[str, object]]: A list of dicts of parameter names and values for each follow up request.
    """
    follow_up_params = self.get_follow_up_returned_params()

    if isinstance(follow_up_params, list):
        return follow_up_params  # FIXME: Would extra params need to come into play?

    return [{**follow_up_params, **self.get_follow_up_extra_params()}]

get_follow_up_failure_cleanup_params

get_follow_up_failure_cleanup_params() -> dict[str, object]

Return any extra information required from this response to clean up after a failed follow up request.

Note that this dict uses the alias field names (as seen on the API), not the python field names.

This is used for context management.

Source code in horde_sdk/generic_api/apimodels.py
def get_follow_up_failure_cleanup_params(self) -> dict[str, object]:
    """Return any extra information required from this response to clean up after a failed follow up request.

    Note that this dict uses the alias field names (as seen on the API), not the python field names.

    This is used for context management.
    """
    return {}

get_follow_up_failure_cleanup_request

get_follow_up_failure_cleanup_request() -> (
    list[HordeRequest]
)

Return the request for this response to clean up after a failed follow up request.

Source code in horde_sdk/generic_api/apimodels.py
def get_follow_up_failure_cleanup_request(self) -> list[HordeRequest]:
    """Return the request for this response to clean up after a failed follow up request."""
    if self.ignore_failure():
        return []

    if hasattr(self, "_cleanup_requests") and self._cleanup_requests is not None:
        return self._cleanup_requests

    cleanup_request_type = self.get_follow_up_failure_cleanup_request_type()
    if not cleanup_request_type:
        raise ValueError("No cleanup request type defined")

    self._cleanup_requests = []

    all_cleanup_params: list[dict[str, object]] = self.get_follow_up_all_params()
    for cleanup_params in all_cleanup_params:
        cleanup_params.update(self.get_follow_up_failure_cleanup_params())
        self._cleanup_requests.append(cleanup_request_type.model_validate(cleanup_params))

    return self._cleanup_requests

ignore_failure

ignore_failure() -> bool

Return if the object is in a state which doesn't require failure follow up.

Source code in horde_sdk/generic_api/apimodels.py
def ignore_failure(self) -> bool:
    """Return if the object is in a state which doesn't require failure follow up."""
    # ImageGenerateJobPopResponse was the use case at the time of writing
    return False

does_target_request_follow_up

does_target_request_follow_up(
    target_request: HordeRequest,
) -> bool

Return whether the target_request would follow up on this request.

Parameters:

  • target_request (HordeRequest) –

    The request to check if it would follow up on this request.

Returns:

  • bool ( bool ) –

    Whether the target_request would follow up on this request.

Source code in horde_sdk/generic_api/apimodels.py
def does_target_request_follow_up(self, target_request: HordeRequest) -> bool:
    """Return whether the `target_request` would follow up on this request.

    Args:
        target_request (HordeRequest): The request to check if it would follow up on this request.

    Returns:
        bool: Whether the `target_request` would follow up on this request.
    """
    follow_up_returned_params = self.get_follow_up_returned_params(as_python_field_name=True)

    if len(follow_up_returned_params) == 0:
        logger.warning("No follow up returned params defined for this request")
        return False
    all_match = True
    for param_set in follow_up_returned_params:
        for key, value in param_set.items():
            if hasattr(target_request, key) and getattr(target_request, key) != value:
                all_match = False
                break
    return all_match

validate_id

validate_id(v: str | GenerationID) -> GenerationID | str

Ensure that the job ID is not empty.

Source code in horde_sdk/ai_horde_api/apimodels/base.py
@field_validator("id_", mode="before")
def validate_id(cls, v: str | GenerationID) -> GenerationID | str:
    """Ensure that the job ID is not empty."""
    if isinstance(v, str) and v == "":
        logger.warning("Job ID is empty")
        return GenerationID(root=uuid.uuid4())

    return v

get_sensitive_fields classmethod

get_sensitive_fields() -> set[str]

Return a set of fields which should be redacted from logs.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def get_sensitive_fields(cls) -> set[str]:
    """Return a set of fields which should be redacted from logs."""
    return {"apikey"}

get_extra_fields_to_exclude_from_log

get_extra_fields_to_exclude_from_log() -> set[str]

Return an additional set of fields to exclude from the log_safe_model_dump method.

Source code in horde_sdk/generic_api/apimodels.py
def get_extra_fields_to_exclude_from_log(self) -> set[str]:
    """Return an additional set of fields to exclude from the log_safe_model_dump method."""
    return set()

log_safe_model_dump

log_safe_model_dump(
    extra_exclude: set[str] | None = None,
) -> dict[Any, Any]

Return a dict of the model's fields, with any sensitive fields redacted.

Source code in horde_sdk/generic_api/apimodels.py
def log_safe_model_dump(self, extra_exclude: set[str] | None = None) -> dict[Any, Any]:
    """Return a dict of the model's fields, with any sensitive fields redacted."""
    if extra_exclude is None:
        extra_exclude = set()

    if hasattr(self, "model_dump"):
        return self.model_dump(  # type: ignore
            exclude=self.get_sensitive_fields() | self.get_extra_fields_to_exclude_from_log() | extra_exclude,
        )

    logger.warning("Model does not have a model_dump method. Using python native class compatible method.")
    logger.debug(
        "Generally this should not be relied upon. If you're seeing this and you're a developer for the SDK, "
        "consider using pydantic models instead.",
    )
    # Its not a pydantic model, use python native class compatible method
    return {
        key: getattr(self, key)
        for key in self.__dict__
        if key not in self.get_sensitive_fields() | self.get_extra_fields_to_exclude_from_log() | extra_exclude
    }

AlchemyAsyncRequestFormItem

Bases: HordeAPIData

Represents a single form of alchemy to request.

See :class:horde_sdk.generation_parameters.alchemy.consts.KNOWN_ALCHEMY_TYPES for the list of known alchemy types.

Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
class AlchemyAsyncRequestFormItem(HordeAPIData):
    """Represents a single form of alchemy to request.

    See :class:`horde_sdk.generation_parameters.alchemy.consts.KNOWN_ALCHEMY_TYPES` for the list of
    known alchemy types.
    """

    name: KNOWN_ALCHEMY_TYPES | str
    """The name of the form to request."""

    payload: Any | None = None
    """Not currently supported."""

    @field_validator("name")
    def validate_name(cls, v: KNOWN_ALCHEMY_TYPES | str) -> KNOWN_ALCHEMY_TYPES | str:
        """Validate the name of the form to request."""
        if isinstance(v, KNOWN_ALCHEMY_TYPES):
            return v
        if str(v) not in KNOWN_ALCHEMY_TYPES.__members__:
            logger.warning(f"Unknown alchemy form name {v}. Is your SDK out of date or did the API change?")
        return v

name instance-attribute

name: KNOWN_ALCHEMY_TYPES | str

The name of the form to request.

payload class-attribute instance-attribute

payload: Any | None = None

Not currently supported.

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

validate_name

validate_name(
    v: KNOWN_ALCHEMY_TYPES | str,
) -> KNOWN_ALCHEMY_TYPES | str

Validate the name of the form to request.

Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@field_validator("name")
def validate_name(cls, v: KNOWN_ALCHEMY_TYPES | str) -> KNOWN_ALCHEMY_TYPES | str:
    """Validate the name of the form to request."""
    if isinstance(v, KNOWN_ALCHEMY_TYPES):
        return v
    if str(v) not in KNOWN_ALCHEMY_TYPES.__members__:
        logger.warning(f"Unknown alchemy form name {v}. Is your SDK out of date or did the API change?")
    return v

AlchemyAsyncRequest

Bases: BaseAIHordeRequest, APIKeyAllowedInRequestMixin

Data required to request an alchemy job. Alchemy includes upscaling, captioning, etc.

Multiple forms of alchemy can be requested at once.

See :class:horde_sdk.generation_parameters.alchemy.consts.KNOWN_ALCHEMY_TYPES for the list of known alchemy types.

Represents a POST request to the /v2/interrogate/async endpoint.

v2 API Model: ModelInterrogationInputStable

Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@Unhashable
@Unequatable
class AlchemyAsyncRequest(
    BaseAIHordeRequest,
    APIKeyAllowedInRequestMixin,
):
    """Data required to request an alchemy job. Alchemy includes upscaling, captioning, etc.

    Multiple forms of alchemy can be requested at once.

    See :class:`horde_sdk.generation_parameters.alchemy.consts.KNOWN_ALCHEMY_TYPES` for the list of
    known alchemy types.

    Represents a POST request to the /v2/interrogate/async endpoint.

    v2 API Model: `ModelInterrogationInputStable`
    """

    forms: list[AlchemyAsyncRequestFormItem]
    """The list of forms (types of post-processing/interrogation/captioning/etc) to request."""
    source_image: str
    """The public URL of the source image or a base64 string to use."""
    slow_workers: bool = True
    """Whether to use the slower workers. Costs additional kudos if `False`."""
    extra_slow_workers: bool = False
    """Whether to use the super slow workers."""
    webhook: str | None = None
    """Provide a URL where the AI Horde will send a POST call after each delivered generation. The request will
    include the details of the job as well as the request ID."""

    @field_validator("forms")
    def validate_at_least_one_form(cls, v: list[AlchemyAsyncRequestFormItem]) -> list[AlchemyAsyncRequestFormItem]:
        """Ensure at least one form is provided."""
        if not v:
            raise ValueError("At least one form must be provided.")
        return v

    @field_validator("source_image")
    def validate_source_image(cls, v: str) -> str:
        """Validate the source image URL or base64 string."""
        if "http" in v:
            parsed_url = urllib.parse.urlparse(v)
            if parsed_url.scheme not in ["http", "https"]:
                raise ValueError("Source image must be a public URL.")
        else:
            try:
                base64.b64decode(v)
            except Exception as e:
                raise ValueError("Source image must be a base64 string.") from e

        return v

    @override
    @classmethod
    def get_api_model_name(cls) -> str | None:
        return "ModelInterrogationInputStable"

    @override
    @classmethod
    def get_http_method(cls) -> HTTPMethod:
        return HTTPMethod.POST

    @override
    @classmethod
    def get_api_endpoint_subpath(cls) -> AI_HORDE_API_ENDPOINT_SUBPATH:
        return AI_HORDE_API_ENDPOINT_SUBPATH.v2_interrogate_async

    @override
    @classmethod
    def get_default_success_response_type(cls) -> type[AlchemyAsyncResponse]:
        return AlchemyAsyncResponse

    @override
    @classmethod
    def get_success_status_response_pairs(cls) -> dict[HTTPStatusCode, type[HordeResponseTypes]]:
        return {
            HTTPStatusCode.ACCEPTED: cls.get_default_success_response_type(),
        }

    @override
    def get_number_of_results_expected(self) -> int:
        return len(self.forms)

    @override
    def get_extra_fields_to_exclude_from_log(self) -> set[str]:
        return {"source_image"}

forms instance-attribute

forms: list[AlchemyAsyncRequestFormItem]

The list of forms (types of post-processing/interrogation/captioning/etc) to request.

source_image instance-attribute

source_image: str

The public URL of the source image or a base64 string to use.

slow_workers class-attribute instance-attribute

slow_workers: bool = True

Whether to use the slower workers. Costs additional kudos if False.

extra_slow_workers class-attribute instance-attribute

extra_slow_workers: bool = False

Whether to use the super slow workers.

webhook class-attribute instance-attribute

webhook: str | None = None

Provide a URL where the AI Horde will send a POST call after each delivered generation. The request will include the details of the job as well as the request ID.

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

apikey class-attribute instance-attribute

apikey: str | None = None

Defaults to ANON_API_KEY. See also .is_api_key_required()

accept class-attribute instance-attribute

accept: GenericAcceptTypes = json

The 'accept' header field.

client_agent class-attribute instance-attribute

client_agent: str = Field(
    default=default_bridge_agent_string,
    alias="Client-Agent",
)

The requesting client's agent. You should set this to reflect the name, version and contact information for your client.

validate_at_least_one_form

validate_at_least_one_form(
    v: list[AlchemyAsyncRequestFormItem],
) -> list[AlchemyAsyncRequestFormItem]

Ensure at least one form is provided.

Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@field_validator("forms")
def validate_at_least_one_form(cls, v: list[AlchemyAsyncRequestFormItem]) -> list[AlchemyAsyncRequestFormItem]:
    """Ensure at least one form is provided."""
    if not v:
        raise ValueError("At least one form must be provided.")
    return v

validate_source_image

validate_source_image(v: str) -> str

Validate the source image URL or base64 string.

Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@field_validator("source_image")
def validate_source_image(cls, v: str) -> str:
    """Validate the source image URL or base64 string."""
    if "http" in v:
        parsed_url = urllib.parse.urlparse(v)
        if parsed_url.scheme not in ["http", "https"]:
            raise ValueError("Source image must be a public URL.")
    else:
        try:
            base64.b64decode(v)
        except Exception as e:
            raise ValueError("Source image must be a base64 string.") from e

    return v

get_api_model_name classmethod

get_api_model_name() -> str | None
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_api_model_name(cls) -> str | None:
    return "ModelInterrogationInputStable"

get_http_method classmethod

get_http_method() -> HTTPMethod
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_http_method(cls) -> HTTPMethod:
    return HTTPMethod.POST

get_api_endpoint_subpath classmethod

get_api_endpoint_subpath() -> AI_HORDE_API_ENDPOINT_SUBPATH
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_api_endpoint_subpath(cls) -> AI_HORDE_API_ENDPOINT_SUBPATH:
    return AI_HORDE_API_ENDPOINT_SUBPATH.v2_interrogate_async

get_default_success_response_type classmethod

get_default_success_response_type() -> (
    type[AlchemyAsyncResponse]
)
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_default_success_response_type(cls) -> type[AlchemyAsyncResponse]:
    return AlchemyAsyncResponse

get_success_status_response_pairs classmethod

get_success_status_response_pairs() -> (
    dict[HTTPStatusCode, type[HordeResponseTypes]]
)
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
@classmethod
def get_success_status_response_pairs(cls) -> dict[HTTPStatusCode, type[HordeResponseTypes]]:
    return {
        HTTPStatusCode.ACCEPTED: cls.get_default_success_response_type(),
    }

get_number_of_results_expected

get_number_of_results_expected() -> int
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
def get_number_of_results_expected(self) -> int:
    return len(self.forms)

get_extra_fields_to_exclude_from_log

get_extra_fields_to_exclude_from_log() -> set[str]
Source code in horde_sdk/ai_horde_api/apimodels/alchemy/async_.py
@override
def get_extra_fields_to_exclude_from_log(self) -> set[str]:
    return {"source_image"}

get_sensitive_fields classmethod

get_sensitive_fields() -> set[str]
Source code in horde_sdk/generic_api/apimodels.py
@override
@classmethod
def get_sensitive_fields(cls) -> set[str]:
    return {"apikey"}

log_safe_model_dump

log_safe_model_dump(
    extra_exclude: set[str] | None = None,
) -> dict[Any, Any]

Return a dict of the model's fields, with any sensitive fields redacted.

Source code in horde_sdk/generic_api/apimodels.py
def log_safe_model_dump(self, extra_exclude: set[str] | None = None) -> dict[Any, Any]:
    """Return a dict of the model's fields, with any sensitive fields redacted."""
    if extra_exclude is None:
        extra_exclude = set()

    if hasattr(self, "model_dump"):
        return self.model_dump(  # type: ignore
            exclude=self.get_sensitive_fields() | self.get_extra_fields_to_exclude_from_log() | extra_exclude,
        )

    logger.warning("Model does not have a model_dump method. Using python native class compatible method.")
    logger.debug(
        "Generally this should not be relied upon. If you're seeing this and you're a developer for the SDK, "
        "consider using pydantic models instead.",
    )
    # Its not a pydantic model, use python native class compatible method
    return {
        key: getattr(self, key)
        for key in self.__dict__
        if key not in self.get_sensitive_fields() | self.get_extra_fields_to_exclude_from_log() | extra_exclude
    }

is_api_key_required classmethod

is_api_key_required() -> bool

Return whether this endpoint requires an API key.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def is_api_key_required(cls) -> bool:
    """Return whether this endpoint requires an API key."""
    return True

validate_api_key_length

validate_api_key_length(v: str) -> str

Validate that the API key is the correct length, or is the special ANON_API_KEY.

Source code in horde_sdk/generic_api/apimodels.py
@field_validator("apikey", mode="before")
def validate_api_key_length(cls, v: str) -> str:
    """Validate that the API key is the correct length, or is the special ANON_API_KEY."""
    if v is None:
        return ANON_API_KEY
    if v == ANON_API_KEY:
        return v
    if len(v) == 36:
        try:
            uuid.UUID(v)
            return v
        except ValueError as e:
            raise ValueError("API key must be a valid UUID") from e
        return v
    if len(v) != 22:
        raise ValueError("API key must be 22 characters long")
    return v

get_api_endpoint_url classmethod

get_api_endpoint_url() -> str

Return the endpoint URL, including the path to the specific API action defined by this object.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def get_api_endpoint_url(cls) -> str:
    """Return the endpoint URL, including the path to the specific API action defined by this object."""
    return url_with_path(base_url=cls.get_api_url(), path=cls.get_api_endpoint_subpath())

get_api_url classmethod

get_api_url() -> str
Source code in horde_sdk/ai_horde_api/apimodels/base.py
@override
@classmethod
def get_api_url(cls) -> str:
    return AI_HORDE_BASE_URL

get_header_fields classmethod

get_header_fields() -> list[str]

Return a list of field names from this request object that should be sent as header fields.

This is in addition to GenericHeaderFields's values, and possibly the API specific class which inherits from GenericHeaderFields, typically found in the horde_sdk.<api_name>_api.metadata module.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def get_header_fields(cls) -> list[str]:
    """Return a list of field names from this request object that should be sent as header fields.

    This is in addition to `GenericHeaderFields`'s values, and possibly the API specific class
    which inherits from `GenericHeaderFields`, typically found in the `horde_sdk.<api_name>_api.metadata` module.
    """
    return []

get_query_fields classmethod

get_query_fields() -> list[str]

Return a list of field names from this request object that should be sent as query parameters.

This is in addition to GenericQueryFields's values, and possibly the API specific class which inherits from GenericQueryFields, typically found in the horde_sdk.<api_name>_api.metadata module.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def get_query_fields(cls) -> list[str]:
    """Return a list of field names from this request object that should be sent as query parameters.

    This is in addition to `GenericQueryFields`'s values, and possibly the API specific class
    which inherits from `GenericQueryFields`, typically found in the `horde_sdk.<api_name>_api.metadata` module.
    """
    return []

get_requires_follow_up

get_requires_follow_up() -> bool

Return whether this request requires a follow up request(s).

Returns:

  • bool ( bool ) –

    Whether this request requires a follow up request to close the job on the server.

Source code in horde_sdk/generic_api/apimodels.py
def get_requires_follow_up(self) -> bool:
    """Return whether this request requires a follow up request(s).

    Returns:
        bool: Whether this request requires a follow up request to close the job on the server.
    """
    for response_type in self.get_success_status_response_pairs().values():
        if issubclass(response_type, ResponseRequiringFollowUpMixin):
            return True
    return False