"""Base module for model prediction endpoint query.""" from __future__ import annotations import json import logging from abc import ABC, abstractmethod from pathlib import Path from typing import Any from folding_studio_data_models import FoldingModel from pydantic import BaseModel class Query(ABC): """Interface to define folding job queries.""" MODEL: FoldingModel | None = None @classmethod @abstractmethod def from_file(cls, path: str | Path, **kwargs) -> Query: """Instantiates a Query object from a file.""" ... @classmethod @abstractmethod def from_directory(cls, path: str | Path, **kwargs) -> Query: """Instantiates a Query object from a directory.""" ... @classmethod @abstractmethod def from_protein_sequence(cls, protein: str, **kwargs) -> Query: """Instantiates a Query object from string representation of a protein.""" ... @property @abstractmethod def payload(self) -> dict[str, Any]: """Returns the payload to be sent in the POST request.""" ... @property @abstractmethod def parameters(self) -> BaseModel: """Parameters of the query.""" ... def save_parameters(self, output_dir: Path) -> None: """Writes the input parameters to a JSON file inside the output directory. Args: output_dir (Path): The directory where the inference parameters JSON file will be saved. """ inference_parameters_path = output_dir / "query_parameters.json" output_dir.mkdir(parents=True, exist_ok=True) with inference_parameters_path.open("w", encoding="utf-8") as f: json.dump(self.parameters.model_dump(mode="json"), f, indent=4) logging.info(f"Input parameters written to {inference_parameters_path}")