Source code for openprotein.prompt.models
from openprotein.base import APISession
from openprotein.jobs import Future, JobsAPI
from openprotein.protein import Protein
from . import api
from .schemas import PromptJob, PromptMetadata, QueryMetadata
[docs]
class Prompt(Future):
"""Prompt which contains a set of sequences and/or structures used to condition the PoET models."""
metadata: PromptMetadata
session: APISession
job: PromptJob | None
[docs]
def __init__(
self,
session: APISession,
job: PromptJob | None = None,
metadata: PromptMetadata | None = None,
num_replicates: int | None = None,
):
"""
Initialize a new Prompt instance.
Parameters
----------
session : APISession
An APISession object used for interacting with the API.
job: PromptJob | None
A PromptJob containing information about the optional prompt job.
metadata : PromptMetadata
A PromptMetadata object containing metadata for the prompt.
"""
"""Initializes with either job get or svd metadata get."""
if metadata is None:
# use job to fetch metadata
if job is None:
raise ValueError("Expected prompt metadata or job")
# if no num_replicates, we need an api call to get the info
if num_replicates is None:
metadata = api.get_prompt_metadata(
session=session, prompt_id=job.job_id
)
# else we can just build the metadata from the job
else:
metadata = PromptMetadata(
id=job.job_id,
name=job.job_id,
description=None,
created_date=job.created_date,
num_replicates=num_replicates,
job_id=job.job_id,
status=job.status,
)
self.metadata = metadata
self.session = session
if self.metadata.job_id is not None:
jobs_api = getattr(session, "jobs", None)
assert isinstance(jobs_api, JobsAPI)
job = PromptJob.create(jobs_api.get_job(job_id=self.metadata.job_id))
super().__init__(session, job)
def __str__(self) -> str:
return str(self.metadata)
def __repr__(self) -> str:
return repr(self.metadata)
[docs]
def get(self) -> list[list[Protein]]:
context = api.get_prompt(session=self.session, prompt_id=str(self.id))
return context
def _wait_job(self, **kwargs):
if self.job is None:
return None
return super()._wait_job(**kwargs)
@property
def id(self):
return self.metadata.id
@property
def name(self):
return self.metadata.name
@property
def description(self):
return self.metadata.description
@property
def created_date(self):
return self.metadata.created_date
@property
def num_replicates(self):
return self.metadata.num_replicates
@property
def status(self):
if self.job is not None:
return super().status
return self.metadata.status
[docs]
class Query:
"""Query containing a sequence/structure used to query the PoET-2 model which opens up new workflows."""
metadata: QueryMetadata
session: APISession
[docs]
def __init__(self, session: APISession, metadata: QueryMetadata):
"""
Initialize a new Query instance.
Parameters
----------
session : APISession
An APISession object used for interacting with the API.
metadata : QueryMetadata
A QueryMetadata object containing metadata for the query.
"""
self.metadata = metadata
self.session = session
def __str__(self) -> str:
return str(self.metadata)
def __repr__(self) -> str:
return repr(self.metadata)
def get(self) -> Protein:
query = api.get_query(session=self.session, query_id=str(self.id))
return query
@property
def id(self):
return self.metadata.id
@property
def created_date(self):
return self.metadata.created_date