Skip to content

pop

ModelPayloadKobold

Bases: ModelPayloadRootKobold

Mixin for the model payload for Kobold.

Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
class ModelPayloadKobold(ModelPayloadRootKobold):
    """Mixin for the model payload for Kobold."""

    prompt: str | None = None
    """The prompt for the text generation."""

prompt class-attribute instance-attribute

prompt: str | None = None

The prompt for the text generation.

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

dynatemp_exponent class-attribute instance-attribute

dynatemp_exponent: float | None = Field(1, ge=0.0, le=5.0)

Dynamic temperature exponent value.

dynatemp_range class-attribute instance-attribute

dynatemp_range: float | None = Field(0, ge=0.0, le=5.0)

Dynamic temperature range value.

frmtadsnsp class-attribute instance-attribute

frmtadsnsp: bool | None = Field(
    default=None,
    description="Input formatting option. When enabled, adds a leading space to your input if there is no trailing whitespace at the end of the previous action.",
    examples=[False],
)

Input formatting option. When enabled, adds a leading space to your input if there is no trailing whitespace at the end of the previous action.

frmtrmblln class-attribute instance-attribute

frmtrmblln: bool | None = Field(
    default=None,
    description="Output formatting option. When enabled, replaces all occurrences of two or more consecutive newlines in the output with one newline.",
    examples=[False],
)

Output formatting option. When enabled, replaces all occurrences of two or more consecutive newlines in the output with one newline.

frmtrmspch class-attribute instance-attribute

frmtrmspch: bool | None = Field(
    default=None, examples=[False]
)

Output formatting option. When enabled, removes #/@%}{+=~|\^<> from the output.

frmttriminc class-attribute instance-attribute

frmttriminc: bool | None = Field(
    default=None,
    description="Output formatting option. When enabled, removes some characters from the end of the output such that the output doesn't end in the middle of a sentence. If the output is less than one sentence long, does nothing.",
    examples=[False],
)

Output formatting option. When enabled, removes some characters from the end of the output such that the output doesn't end in the middle of a sentence. If the output is less than one sentence long, does nothing.

min_p class-attribute instance-attribute

min_p: float | None = Field(0, ge=0.0, le=1.0)

Min-p sampling value.

rep_pen class-attribute instance-attribute

rep_pen: float | None = Field(default=None, ge=1.0, le=3.0)

Base repetition penalty value.

rep_pen_range class-attribute instance-attribute

rep_pen_range: int | None = Field(
    default=None, ge=0, le=4096
)

Repetition penalty range.

rep_pen_slope class-attribute instance-attribute

rep_pen_slope: float | None = Field(
    default=None, ge=0.0, le=10.0
)

Repetition penalty slope.

sampler_order class-attribute instance-attribute

sampler_order: list[int] | None = None

The sampler order to use for the generation.

singleline class-attribute instance-attribute

singleline: bool | None = Field(
    default=None,
    description="Output formatting option. When enabled, removes everything after the first line of the output, including the newline.",
    examples=[False],
)

Output formatting option. When enabled, removes everything after the first line of the output, including the newline.

smoothing_factor class-attribute instance-attribute

smoothing_factor: float | None = Field(0, ge=0.0, le=10.0)

Quadratic sampling value.

stop_sequence class-attribute instance-attribute

stop_sequence: list[str] | None = None

The stop sequences to use for the generation.

temperature class-attribute instance-attribute

temperature: float | None = Field(
    default=None, ge=0.0, le=5.0
)

Temperature value.

tfs class-attribute instance-attribute

tfs: float | None = Field(default=None, ge=0.0, le=1.0)

Tail free sampling value.

top_a class-attribute instance-attribute

top_a: float | None = Field(default=None, ge=0.0, le=1.0)

Top-a sampling value.

top_k class-attribute instance-attribute

top_k: int | None = Field(default=None, ge=0, le=100)

Top-k sampling value.

top_p class-attribute instance-attribute

top_p: float | None = Field(default=None, ge=0.001, le=1.0)

Top-p sampling value.

typical class-attribute instance-attribute

typical: float | None = Field(default=None, ge=0.0, le=1.0)

Typical sampling value.

use_default_badwordsids class-attribute instance-attribute

use_default_badwordsids: bool | None = None

When True, uses the default KoboldAI bad word IDs.

n class-attribute instance-attribute

n: int | None = Field(
    default=None, examples=[1], ge=1, le=20
)

The number of generations to produce.

max_length class-attribute instance-attribute

max_length: int | None = Field(80, ge=16, le=1024)

Number of tokens to generate.

max_context_length class-attribute instance-attribute

max_context_length: int | None = Field(
    default=1024, ge=80, le=32000
)

Maximum number of tokens to send to the model.

NoValidRequestFoundKobold

Bases: NoValidRequestFound

The number of jobs a worker was skipped for, and why.

v2 API Model: NoValidRequestFoundKobold

Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
class NoValidRequestFoundKobold(NoValidRequestFound):
    """The number of jobs a worker was skipped for, and why.

    v2 API Model: `NoValidRequestFoundKobold`
    """

    max_context_length: int | None = Field(default=None)
    """How many waiting requests were skipped because they demanded a higher max_context_length than what this
    worker provides."""
    max_length: int | None = Field(default=None)
    """How many waiting requests were skipped because they demanded a higher max_length than what this
    worker provides."""
    matching_softprompt: int | None = Field(default=None)
    """How many waiting requests were skipped because they demanded an available soft-prompt which this worker does not
    have."""

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

max_context_length class-attribute instance-attribute

max_context_length: int | None = Field(default=None)

How many waiting requests were skipped because they demanded a higher max_context_length than what this worker provides.

max_length class-attribute instance-attribute

max_length: int | None = Field(default=None)

How many waiting requests were skipped because they demanded a higher max_length than what this worker provides.

matching_softprompt class-attribute instance-attribute

matching_softprompt: int | None = Field(default=None)

How many waiting requests were skipped because they demanded an available soft-prompt which this worker does not have.

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

blacklist class-attribute instance-attribute

blacklist: int | None = Field(default=None, ge=0)

How many waiting requests were skipped because they demanded a generation with a word that this worker does not accept.

bridge_version class-attribute instance-attribute

bridge_version: int | None = Field(
    default=None, examples=[0], ge=0
)

How many waiting requests were skipped because they require a higher version of the bridge than this worker is running (upgrade if you see this in your skipped list).

kudos class-attribute instance-attribute

kudos: int | None = Field(default=None)

How many waiting requests were skipped because the user didn't have enough kudos when this worker requires

models class-attribute instance-attribute

models: int | None = Field(default=None, examples=[0], ge=0)

How many waiting requests were skipped because they demanded a different model than what this worker provides.

nsfw class-attribute instance-attribute

nsfw: int | None = Field(default=None, ge=0)

How many waiting requests were skipped because they demanded a nsfw generation which this worker does not provide.

performance class-attribute instance-attribute

performance: int | None = Field(default=None, ge=0)

How many waiting requests were skipped because they demanded a higher performance than this worker provides.

untrusted class-attribute instance-attribute

untrusted: int | None = Field(default=None, ge=0)

How many waiting requests were skipped because they demanded a trusted worker which this worker is not.

worker_id class-attribute instance-attribute

worker_id: int | None = Field(default=None, ge=0)

How many waiting requests were skipped because they demanded a specific worker.

get_api_model_name classmethod

get_api_model_name() -> str | None
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
@classmethod
def get_api_model_name(cls) -> str | None:
    return "NoValidRequestFoundKobold"

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
    }

is_empty

is_empty() -> bool

Whether or not this object has any non-zero values.

Source code in horde_sdk/ai_horde_api/apimodels/generate/pop.py
def is_empty(self) -> bool:
    """Whether or not this object has any non-zero values."""
    return len(self.model_fields_set) == 0

TextGenerateJobPopResponse

Bases: HordeResponseBaseModel, ResponseRequiringFollowUpMixin, ExtraSourceImageMixin

Request additional jobs, if any are available, for a text generation worker.

This is the key response type for all text generation workers as it contains all assignment data for the worker.

Represents the data returned from the /v2/generate/text/pop endpoint with http status code 200.

v2 API Model: GenerationPayloadKobold

Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
class TextGenerateJobPopResponse(
    HordeResponseBaseModel,
    ResponseRequiringFollowUpMixin,
    ExtraSourceImageMixin,
):
    """Request additional jobs, if any are available, for a text generation worker.

    This is the key response type for all text generation workers as it contains all assignment
    data for the worker.

    Represents the data returned from the /v2/generate/text/pop endpoint with http status code 200.

    v2 API Model: `GenerationPayloadKobold`
    """

    payload: ModelPayloadKobold
    """The settings for this text generation."""
    id_: GenerationID | None = Field(default=None, alias="id")
    """The UUID for this text generation."""
    ids: list[GenerationID]
    """The UUIDs for this text generations."""
    skipped: NoValidRequestFoundKobold = Field(NoValidRequestFoundKobold())
    """The skipped requests that were not valid for this worker."""
    softprompt: str | None = Field(default=None)
    """The soft prompt requested for this generation."""
    model: str | None = Field(default=None)
    """The model requested for this generation."""
    ttl: int | None = None
    """The amount of seconds before this job is considered stale and aborted."""

    messages: list[PopResponseModelMessage] | None = None
    """The messages sent to this worker."""

    @field_validator("id_", mode="before")
    def validate_id(cls, v: str | GenerationID) -> GenerationID | str:
        """Validate the ID is not an empty string."""
        if isinstance(v, str) and v == "":
            logger.warning("Job ID is empty")
            return GenerationID(root=uuid.uuid4())

        return v

    @model_validator(mode="after")
    def ids_present(self) -> TextGenerateJobPopResponse:
        """Ensure that either id_ or ids is present."""
        if self.model is None:
            if self.skipped.is_empty():
                logger.debug("No model or skipped data found in response.")
            else:
                logger.debug("No model found in response.")
            return self

        if self.id_ is None and len(self.ids) == 0:
            raise ValueError("Neither id_ nor ids were present in the response.")

        return self

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

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

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

    @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 [{"id": self.id_}]

    @override
    async def async_download_additional_data(self, client_session: aiohttp.ClientSession) -> None:
        await self.async_download_extra_source_images(client_session)

    @override
    def download_additional_data(self) -> None:
        raise NotImplementedError("This method has not been implemented for this class.")

    def __eq__(self, value: object) -> bool:
        if not isinstance(value, TextGenerateJobPopResponse):
            return False

        if self.ids:
            return all(id_ in value.ids for id_ in self.ids)

        return self.id_ == value.id_

    def __hash__(self) -> int:
        if self.ids:
            return hash(tuple(sorted(self.ids)))

        return hash(self.id_)

payload instance-attribute

payload: ModelPayloadKobold

The settings for this text generation.

id_ class-attribute instance-attribute

id_: GenerationID | None = Field(default=None, alias='id')

The UUID for this text generation.

ids instance-attribute

ids: list[GenerationID]

The UUIDs for this text generations.

skipped class-attribute instance-attribute

skipped: NoValidRequestFoundKobold = Field(
    NoValidRequestFoundKobold()
)

The skipped requests that were not valid for this worker.

softprompt class-attribute instance-attribute

softprompt: str | None = Field(default=None)

The soft prompt requested for this generation.

model class-attribute instance-attribute

model: str | None = Field(default=None)

The model requested for this generation.

ttl class-attribute instance-attribute

ttl: int | None = None

The amount of seconds before this job is considered stale and aborted.

messages class-attribute instance-attribute

messages: list[PopResponseModelMessage] | None = None

The messages sent to this worker.

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

extra_source_images class-attribute instance-attribute

extra_source_images: list[ExtraSourceImageEntry] | None = (
    None
)

Additional uploaded images (as base64) which can be used for further operations.

time_constructed property

time_constructed: float

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

validate_id

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

Validate the ID is not an empty string.

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

    return v

ids_present

ids_present() -> TextGenerateJobPopResponse

Ensure that either id_ or ids is present.

Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@model_validator(mode="after")
def ids_present(self) -> TextGenerateJobPopResponse:
    """Ensure that either id_ or ids is present."""
    if self.model is None:
        if self.skipped.is_empty():
            logger.debug("No model or skipped data found in response.")
        else:
            logger.debug("No model found in response.")
        return self

    if self.id_ is None and len(self.ids) == 0:
        raise ValueError("Neither id_ nor ids were present in the response.")

    return self

get_api_model_name classmethod

get_api_model_name() -> str | None
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
@classmethod
def get_api_model_name(cls) -> str | None:
    return "GenerationPayloadKobold"

get_follow_up_default_request_type classmethod

get_follow_up_default_request_type() -> (
    type[TextGenerateStatusRequest]
)
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
@classmethod
def get_follow_up_default_request_type(cls) -> type[TextGenerateStatusRequest]:
    return TextGenerateStatusRequest

get_follow_up_failure_cleanup_request_type classmethod

get_follow_up_failure_cleanup_request_type() -> (
    type[DeleteTextGenerateRequest]
)
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
@classmethod
def get_follow_up_failure_cleanup_request_type(cls) -> type[DeleteTextGenerateRequest]:
    return DeleteTextGenerateRequest

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/generate/text/pop.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 [{"id": self.id_}]

async_download_additional_data async

async_download_additional_data(
    client_session: ClientSession,
) -> None
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
async def async_download_additional_data(self, client_session: aiohttp.ClientSession) -> None:
    await self.async_download_extra_source_images(client_session)

download_additional_data

download_additional_data() -> None
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
def download_additional_data(self) -> None:
    raise NotImplementedError("This method has not been implemented for this class.")

__eq__

__eq__(value: object) -> bool
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
def __eq__(self, value: object) -> bool:
    if not isinstance(value, TextGenerateJobPopResponse):
        return False

    if self.ids:
        return all(id_ in value.ids for id_ in self.ids)

    return self.id_ == value.id_

__hash__

__hash__() -> int
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
def __hash__(self) -> int:
    if self.ids:
        return hash(tuple(sorted(self.ids)))

    return hash(self.id_)

download_file_as_base64 async

download_file_as_base64(
    client_session: ClientSession, url: str
) -> str

Download a file and return the value as a base64 string.

Source code in horde_sdk/generic_api/apimodels.py
async def download_file_as_base64(self, client_session: aiohttp.ClientSession, url: str) -> str:
    """Download a file and return the value as a base64 string."""
    async with client_session.get(url, ssl=_default_sslcontext) as response:
        response.raise_for_status()
        return base64.b64encode(await response.read()).decode("utf-8")

download_file_to_field_as_base64 async

download_file_to_field_as_base64(
    client_session: ClientSession, url: str, field_name: str
) -> None

Download a file from a URL and save it to the field.

Parameters:

  • client_session (ClientSession) –

    The aiohttp client session to use for the download.

  • url (str) –

    The URL to download the file from.

  • field_name (str) –

    The name of the field to save the file to.

Source code in horde_sdk/generic_api/apimodels.py
async def download_file_to_field_as_base64(
    self,
    client_session: aiohttp.ClientSession,
    url: str,
    field_name: str,
) -> None:
    """Download a file from a URL and save it to the field.

    Args:
        client_session (aiohttp.ClientSession): The aiohttp client session to use for the download.
        url (str): The URL to download the file from.
        field_name (str): The name of the field to save the file to.
    """
    async with client_session.get(url, ssl=_default_sslcontext) as response:
        response.raise_for_status()
        setattr(self, field_name, base64.b64encode(await response.read()).decode("utf-8"))

async_download_extra_source_images async

async_download_extra_source_images(
    client_session: ClientSession, *, max_retries: int = 5
) -> list[ExtraSourceImageEntry] | None

Download the extra source images concurrently.

You can also use get_downloaded_extra_source_images to get the downloaded images later, if needed.

Parameters:

  • client_session (ClientSession) –

    The aiohttp client session to use for downloading.

  • max_retries (int, default: 5 ) –

    The maximum number of times to retry downloading an image.

Returns:

Source code in horde_sdk/ai_horde_api/apimodels/generate/pop.py
async def async_download_extra_source_images(
    self,
    client_session: aiohttp.ClientSession,
    *,
    max_retries: int = 5,
) -> list[ExtraSourceImageEntry] | None:
    """Download the extra source images concurrently.

    You can also use `get_downloaded_extra_source_images` to get the downloaded images later, if needed.

    Args:
        client_session: The aiohttp client session to use for downloading.
        max_retries: The maximum number of times to retry downloading an image.

    Returns:
        The downloaded extra source images.
    """
    if not self.extra_source_images:
        logger.info("No extra source images to download.")
        return None

    if self._downloaded_extra_source_images is not None:
        logger.warning("Extra source images already downloaded.")
        return self._downloaded_extra_source_images

    self._downloaded_extra_source_images = []

    download_tasks = []
    for extra_source_image in self.extra_source_images:
        download_tasks.append(
            asyncio.create_task(
                self._download_image_if_needed(client_session, extra_source_image, max_retries),
            ),
        )

    await asyncio.gather(*download_tasks)

    self._sort_downloaded_images()
    return self._downloaded_extra_source_images.copy()

get_downloaded_extra_source_images

get_downloaded_extra_source_images() -> (
    list[ExtraSourceImageEntry] | None
)

Get the downloaded extra source images.

Source code in horde_sdk/ai_horde_api/apimodels/generate/pop.py
def get_downloaded_extra_source_images(self) -> list[ExtraSourceImageEntry] | None:
    """Get the downloaded extra source images."""
    return (
        self._downloaded_extra_source_images.copy() if self._downloaded_extra_source_images is not None else None
    )

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

get_follow_up_request_types classmethod

get_follow_up_request_types() -> list[type[HordeRequest]]

Return a list of all the possible follow up request types for this response.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def get_follow_up_request_types(cls) -> list[type[HordeRequest]]:
    """Return a list of all the possible follow up request types for this response."""
    return [cls.get_follow_up_default_request_type()]

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

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
    }

TextGenerateJobPopRequest

Bases: BaseAIHordeRequest, APIKeyAllowedInRequestMixin, _PopInputKobold

Request additional jobs, if any are available, for a text worker.

This is the key request type for all text workers as it contains all the parameters needed to request a job.

Represents a POST request to the /v2/generate/text/pop endpoint.

v2 API Model: PopInputKobold

Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@Unhashable
@Unequatable
class TextGenerateJobPopRequest(
    BaseAIHordeRequest,
    APIKeyAllowedInRequestMixin,
    _PopInputKobold,
):
    """Request additional jobs, if any are available, for a text worker.

    This is the key request type for all text workers as it contains all the parameters needed to request a job.

    Represents a POST request to the /v2/generate/text/pop endpoint.

    v2 API Model: `PopInputKobold`
    """

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

    @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_generate_text_pop

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

model_config class-attribute instance-attribute

model_config = get_default_frozen_model_config_dict()

amount class-attribute instance-attribute

amount: int | None = Field(1, ge=1, le=20)

The number of jobs to pop at the same time.

bridge_agent class-attribute instance-attribute

bridge_agent: str | None = Field(
    "unknown:0:unknown",
    examples=[
        "AI Horde Worker reGen:4.1.0:https://github.com/Haidra-Org/horde-worker-reGen"
    ],
    max_length=1000,
)

The worker name, version and website.

models instance-attribute

models: list[str]

The models this worker can generate.

name instance-attribute

name: str

The Name of the Worker.

nsfw class-attribute instance-attribute

nsfw: bool | None = Field(default=False)

Whether this worker can generate NSFW requests or not.

priority_usernames class-attribute instance-attribute

priority_usernames: list[str] | None = None

The usernames that should be prioritized by this worker.

require_upfront_kudos class-attribute instance-attribute

require_upfront_kudos: bool | None = Field(
    default=False,
    description="If True, this worker will only pick up requests where the owner has the required kudos to consume already available.",
    examples=[False],
)

If True, this worker will only pick up requests where the owner has the required kudos to consume already available.

threads class-attribute instance-attribute

threads: int | None = Field(
    default=1,
    description="How many threads this worker is running. This is used to accurately the current power available in the horde.",
    ge=1,
    le=50,
)

How many threads this worker is running. This is used to accurately the current power available in the horde.

max_length class-attribute instance-attribute

max_length: int = Field(512)

The maximum amount of tokens this worker can generate.

max_context_length class-attribute instance-attribute

max_context_length: int = Field(2048)

The max amount of context to submit to this AI for sampling.

softprompts class-attribute instance-attribute

softprompts: list[str] | None = Field(default=None)

The available softprompt files on this worker for the currently running model.

extra_slow_worker class-attribute instance-attribute

extra_slow_worker: bool = Field(default=False)

If this worker is extra slow and requires a longer timeout.

Note that this reduces the pool of jobs available to this worker.

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.

get_api_model_name classmethod

get_api_model_name() -> str | None
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
@classmethod
def get_api_model_name(cls) -> str | None:
    return "PopInputKobold"

get_http_method classmethod

get_http_method() -> HTTPMethod
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.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/generate/text/pop.py
@override
@classmethod
def get_api_endpoint_subpath(cls) -> AI_HORDE_API_ENDPOINT_SUBPATH:
    return AI_HORDE_API_ENDPOINT_SUBPATH.v2_generate_text_pop

get_default_success_response_type classmethod

get_default_success_response_type() -> (
    type[TextGenerateJobPopResponse]
)
Source code in horde_sdk/ai_horde_api/apimodels/generate/text/pop.py
@override
@classmethod
def get_default_success_response_type(cls) -> type[TextGenerateJobPopResponse]:
    return TextGenerateJobPopResponse

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"}

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
    }

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_success_status_response_pairs classmethod

get_success_status_response_pairs() -> (
    dict[HTTPStatusCode, type[HordeResponseTypes]]
)

Return a dict of HTTP status codes and the expected HordeResponse.

Defaults to {HTTPStatusCode.OK: cls.get_expected_response_type()}, but may be overridden to support other status codes.

Source code in horde_sdk/generic_api/apimodels.py
@classmethod
def get_success_status_response_pairs(
    cls,
) -> dict[HTTPStatusCode, type[HordeResponseTypes]]:
    """Return a dict of HTTP status codes and the expected `HordeResponse`.

    Defaults to `{HTTPStatusCode.OK: cls.get_expected_response_type()}`, but may be overridden to support other
    status codes.
    """
    return {HTTPStatusCode.OK: cls.get_default_success_response_type()}

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_number_of_results_expected

get_number_of_results_expected() -> int

Return the number of (job) results expected from this request.

Defaults to 1, but may be overridden to dynamically change the number of results expected.

This is factored into context management; if the number of results expected is not met, the job is considered unhandled on an exception and followed up on to attempt to close it.

Source code in horde_sdk/generic_api/apimodels.py
def get_number_of_results_expected(self) -> int:
    """Return the number of (job) results expected from this request.

    Defaults to `1`, but may be overridden to dynamically change the number of results expected.

    This is factored into context management; if the number of results expected is not met, the job is considered
    unhandled on an exception and followed up on to attempt to close it.
    """
    return 1

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