Bases: BaseAIHordeRequest, JobRequestMixin, APIKeyAllowedInRequestMixin
Used when a worker submits a generation job. Includes metadata about the generation.
Represents a POST request to the /v2/generate/submit endpoint.
v2 API Model: SubmitInputStable
Source code in horde_sdk/ai_horde_api/apimodels/generate/submit.py
| @Unhashable
@Unequatable
class ImageGenerationJobSubmitRequest(
BaseAIHordeRequest,
JobRequestMixin,
APIKeyAllowedInRequestMixin,
):
"""Used when a worker submits a generation job. Includes metadata about the generation.
Represents a POST request to the /v2/generate/submit endpoint.
v2 API Model: `SubmitInputStable`
"""
generation: str | Literal["R2"] = ""
"""R2 result was uploaded to R2, else the string of the result as base64."""
state: GENERATION_STATE
"""The state of this generation."""
seed: int = 0
"""The seed for this generation."""
censored: bool = False
"""If True, this resulting image has been censored."""
gen_metadata: list[GenMetadataEntry] | None = None
"""Extra metadata about faulted or defaulted components of the generation"""
@model_validator(mode="after")
def validate_generation(self) -> ImageGenerationJobSubmitRequest:
"""Validate the generation field is not an empty string and warn if the seed is 0."""
if self.generation == "":
logger.error("Generation cannot be an empty string.")
logger.error(self.log_safe_model_dump())
if self.seed == 0:
logger.debug(f"Seed is 0 for {self.id_}. That might not be intended.")
logger.debug(self.log_safe_model_dump())
return self
@override
@classmethod
def get_api_model_name(cls) -> str | None:
return "SubmitInputStable"
@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_submit
@override
@classmethod
def get_default_success_response_type(cls) -> type[JobSubmitResponse]:
return JobSubmitResponse
|
generation
class-attribute
instance-attribute
generation: str | Literal['R2'] = ''
R2 result was uploaded to R2, else the string of the result as base64.
state
instance-attribute
The state of this generation.
seed
class-attribute
instance-attribute
The seed for this generation.
censored
class-attribute
instance-attribute
If True, this resulting image has been censored.
gen_metadata: list[GenMetadataEntry] | None = None
Extra metadata about faulted or defaulted components of the generation
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()
id_
class-attribute
instance-attribute
id_: GenerationID = Field(alias='id')
The UUID for this job. Use this to post the results in the future.
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_generation
validate_generation() -> ImageGenerationJobSubmitRequest
Validate the generation field is not an empty string and warn if the seed is 0.
Source code in horde_sdk/ai_horde_api/apimodels/generate/submit.py
| @model_validator(mode="after")
def validate_generation(self) -> ImageGenerationJobSubmitRequest:
"""Validate the generation field is not an empty string and warn if the seed is 0."""
if self.generation == "":
logger.error("Generation cannot be an empty string.")
logger.error(self.log_safe_model_dump())
if self.seed == 0:
logger.debug(f"Seed is 0 for {self.id_}. That might not be intended.")
logger.debug(self.log_safe_model_dump())
return self
|
get_api_model_name
classmethod
get_api_model_name() -> str | None
Source code in horde_sdk/ai_horde_api/apimodels/generate/submit.py
| @override
@classmethod
def get_api_model_name(cls) -> str | None:
return "SubmitInputStable"
|
get_http_method
classmethod
get_http_method() -> HTTPMethod
Source code in horde_sdk/ai_horde_api/apimodels/generate/submit.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/submit.py
| @override
@classmethod
def get_api_endpoint_subpath(cls) -> AI_HORDE_API_ENDPOINT_SUBPATH:
return AI_HORDE_API_ENDPOINT_SUBPATH.v2_generate_submit
|
get_default_success_response_type
classmethod
get_default_success_response_type() -> (
type[JobSubmitResponse]
)
Source code in horde_sdk/ai_horde_api/apimodels/generate/submit.py
| @override
@classmethod
def get_default_success_response_type(cls) -> type[JobSubmitResponse]:
return JobSubmitResponse
|
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() -> 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
|
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
|
__eq__
__eq__(__value: object) -> bool
Source code in horde_sdk/ai_horde_api/apimodels/base.py
| def __eq__(self, __value: object) -> bool:
if isinstance(__value, JobRequestMixin):
return self.id_ == __value.id_
return False
|
__hash__
Source code in horde_sdk/ai_horde_api/apimodels/base.py
| def __hash__(self) -> int:
return hash(JobRequestMixin.__name__) + hash(self.id_)
|
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
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() -> 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
|