Skip to content

Commit c291fe9

Browse files
committed
Release v0.6.0
1 parent 3bede00 commit c291fe9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2692
-407
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
VERSION ?= 0.5.5
1+
VERSION ?= 0.6.0
22
SHELL := /bin/bash
33

44
.PHONY: releasehere

anaconda_build/meta.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package:
22
name: openprotein-python
3-
version: "0.5.5"
3+
version: "0.6.0"
44

55
source:
66
path: ../

openprotein/__init__.py

+67-34
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,27 @@
66
isort:skip_file
77
"""
88

9+
from typing import TYPE_CHECKING
10+
import warnings
11+
912
from openprotein._version import __version__
1013
from openprotein.app import (
11-
AssayDataAPI,
14+
DataAPI,
1215
JobsAPI,
13-
TrainingAPI,
14-
DesignAPI,
1516
AlignAPI,
1617
EmbeddingsAPI,
1718
FoldAPI,
1819
SVDAPI,
1920
UMAPAPI,
2021
PredictorAPI,
21-
DesignerAPI,
22+
DesignAPI,
2223
)
2324
from openprotein.app.models import Future
2425
from openprotein.base import APISession
2526

27+
if TYPE_CHECKING:
28+
from openprotein.app.deprecated import TrainingAPI, DesignAPI
29+
2630

2731
class OpenProtein(APISession):
2832
"""
@@ -31,15 +35,14 @@ class OpenProtein(APISession):
3135

3236
_data = None
3337
_jobs = None
34-
_train = None
35-
_design = None
3638
_align = None
37-
_embedding = None
39+
_embeddings = None
3840
_svd = None
3941
_umap = None
4042
_fold = None
4143
_predictor = None
4244
_designer = None
45+
_deprecated = None
4346

4447
def wait(self, future: Future, *args, **kwargs):
4548
return future.wait(*args, **kwargs)
@@ -50,14 +53,20 @@ def load_job(self, job_id):
5053
return self.jobs.get(job_id=job_id)
5154

5255
@property
53-
def data(self) -> AssayDataAPI:
56+
def data(self) -> DataAPI:
5457
"""
5558
The data submodule gives access to functionality for uploading and accessing user data.
5659
"""
5760
if self._data is None:
58-
self._data = AssayDataAPI(self)
61+
self._data = DataAPI(self)
5962
return self._data
6063

64+
@property
65+
def train(self):
66+
raise AttributeError(
67+
"Access to deprecated train module is under the deprecated property, i.e. session.deprecated.train"
68+
)
69+
6170
@property
6271
def jobs(self) -> JobsAPI:
6372
"""
@@ -67,24 +76,6 @@ def jobs(self) -> JobsAPI:
6776
self._jobs = JobsAPI(self)
6877
return self._jobs
6978

70-
@property
71-
def train(self) -> TrainingAPI:
72-
"""
73-
The train submodule gives access to functionality for training and validating ML models.
74-
"""
75-
if self._train is None:
76-
self._train = TrainingAPI(self)
77-
return self._train
78-
79-
@property
80-
def design(self) -> DesignAPI:
81-
"""
82-
The design submodule gives access to functionality for designing new sequences using models from train.
83-
"""
84-
if self._design is None:
85-
self._design = DesignAPI(self)
86-
return self._design
87-
8879
@property
8980
def align(self) -> AlignAPI:
9081
"""
@@ -99,17 +90,19 @@ def embedding(self) -> EmbeddingsAPI:
9990
"""
10091
The embedding submodule gives access to protein embedding models and their inference endpoints.
10192
"""
102-
if self._embedding is None:
103-
self._embedding = EmbeddingsAPI(self)
104-
return self._embedding
93+
if self._embeddings is None:
94+
self._embeddings = EmbeddingsAPI(self)
95+
return self._embeddings
96+
97+
embeddings = embedding
10598

10699
@property
107100
def svd(self) -> SVDAPI:
108101
"""
109102
The embedding submodule gives access to protein embedding models and their inference endpoints.
110103
"""
111104
if self._svd is None:
112-
self._svd = SVDAPI(self, self.embedding)
105+
self._svd = SVDAPI(self, self.embeddings)
113106
return self._svd
114107

115108
@property
@@ -127,16 +120,16 @@ def predictor(self) -> PredictorAPI:
127120
The predictor submodule gives access to training and predicting with predictors built on top of embeddings.
128121
"""
129122
if self._predictor is None:
130-
self._predictor = PredictorAPI(self, self.embedding, self.svd)
123+
self._predictor = PredictorAPI(self, self.embeddings, self.svd)
131124
return self._predictor
132125

133126
@property
134-
def designer(self) -> DesignerAPI:
127+
def design(self) -> DesignAPI:
135128
"""
136129
The designer submodule gives access to functionality for designing new sequences using models from predictor train.
137130
"""
138131
if self._designer is None:
139-
self._designer = DesignerAPI(self)
132+
self._designer = DesignAPI(self)
140133
return self._designer
141134

142135
@property
@@ -148,5 +141,45 @@ def fold(self) -> FoldAPI:
148141
self._fold = FoldAPI(self)
149142
return self._fold
150143

144+
@property
145+
def deprecated(self) -> "Deprecated":
146+
147+
if self._deprecated is None:
148+
warnings.warn(
149+
"Support for deprecated APIs will be dropped in the future! Read the documentation to migrate to the updated APIs."
150+
)
151+
self._deprecated = self.Deprecated(self)
152+
return self._deprecated
153+
154+
class Deprecated:
155+
156+
_train = None
157+
_design = None
158+
159+
def __init__(self, session: APISession):
160+
self.session = session
161+
162+
@property
163+
def train(self) -> "TrainingAPI":
164+
"""
165+
The train submodule gives access to functionality for training and validating ML models.
166+
"""
167+
from openprotein.app.deprecated import TrainingAPI
168+
169+
if self._train is None:
170+
self._train = TrainingAPI(self.session)
171+
return self._train
172+
173+
@property
174+
def design(self) -> "DesignAPI":
175+
"""
176+
The design submodule gives access to functionality for designing new sequences using models from train.
177+
"""
178+
from openprotein.app.deprecated import DesignAPI
179+
180+
if self._design is None:
181+
self._design = DesignAPI(self.session)
182+
return self._design
183+
151184

152185
connect = OpenProtein

openprotein/align/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from openprotein.app import AlignAPI
2+
from openprotein.app.models import MSAFuture, PromptFuture

openprotein/api/__init__.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
from . import align, assaydata, design, embedding, fold, predict, predictor, train
1+
from . import align, assaydata, embedding, fold, predictor
2+
3+
__all__ = [
4+
"align",
5+
"assaydata",
6+
"embedding",
7+
"fold",
8+
"predictor",
9+
]

openprotein/api/align.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
from openprotein.base import APISession
88
from openprotein.csv import csv_stream
99
from openprotein.errors import APIError, InvalidParameterError, MissingParameterError
10-
from openprotein.schemas import Job, MSASamplingMethod, PoetInputType
10+
from openprotein.schemas import AlignType, Job, MSASamplingMethod
1111

1212

1313
def get_align_job_inputs(
1414
session: APISession,
1515
job_id: str,
16-
input_type: PoetInputType,
16+
input_type: AlignType,
1717
prompt_index: int | None = None,
1818
) -> requests.Response:
1919
"""
@@ -52,7 +52,7 @@ def get_align_job_inputs(
5252
def get_input(
5353
session: APISession,
5454
job: Job,
55-
input_type: PoetInputType,
55+
input_type: AlignType,
5656
prompt_index: int | None = None,
5757
) -> Iterator[list[str]]:
5858
"""
@@ -104,7 +104,7 @@ def get_prompt(
104104
return get_input(
105105
session=session,
106106
job=job,
107-
input_type=PoetInputType.PROMPT,
107+
input_type=AlignType.PROMPT,
108108
prompt_index=prompt_index,
109109
)
110110

@@ -125,7 +125,7 @@ def get_seed(session: APISession, job: Job) -> Iterator[list[str]]:
125125
Iterator[list[str]]
126126
A CSV reader for the seed sequence.
127127
"""
128-
return get_input(session=session, job=job, input_type=PoetInputType.INPUT)
128+
return get_input(session=session, job=job, input_type=AlignType.INPUT)
129129

130130

131131
def get_msa(session: APISession, job: Job) -> Iterator[list[str]]:
@@ -144,7 +144,7 @@ def get_msa(session: APISession, job: Job) -> Iterator[list[str]]:
144144
Iterator[list[str]]
145145
A CSV reader for the MSA data.
146146
"""
147-
return get_input(session=session, job=job, input_type=PoetInputType.MSA)
147+
return get_input(session=session, job=job, input_type=AlignType.MSA)
148148

149149

150150
def msa_post(
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""Deprecated OpenProtein APIs."""
2+
3+
from . import design, predict, train
4+
5+
__all__ = ["design", "predict", "train"]

openprotein/api/deprecated/design.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from openprotein.base import APISession
2+
from openprotein.schemas.deprecated import (
3+
WorkflowDesign,
4+
WorkflowDesignJob,
5+
WorkflowDesignJobCreate,
6+
)
7+
8+
9+
def create_design_job(session: APISession, design_job: WorkflowDesignJobCreate):
10+
"""
11+
Send a POST request for protein design job.
12+
13+
Parameters
14+
----------
15+
session : APISession
16+
The current API session for communication with the server.
17+
design_job : DesignJobCreate
18+
The details of the design job to be created, with the following parameters:
19+
- assay_id: The ID for the assay.
20+
- criteria: Criteria for evaluating the design.
21+
- num_steps: The number of steps in the genetic algo. Default is 8.
22+
- pop_size: The population size for the genetic algo. Default is None.
23+
- n_offsprings: The number of offspring for the genetic algo. Default is None.
24+
- crossover_prob: The crossover probability for the genetic algo. Default is None.
25+
- crossover_prob_pointwise: The pointwise crossover probability for the genetic algo. Default is None.
26+
- mutation_average_mutations_per_seq: The average number of mutations per sequence. Default is None.
27+
- allowed_tokens: A dict of positions and allows tokens (e.g. *{1:['G','L']})* ) designating how mutations may occur. Default is None.
28+
29+
Returns
30+
-------
31+
WorkflowDesignJob
32+
The created job as a Job instance.
33+
"""
34+
params = design_job.model_dump(exclude_none=True)
35+
# print(f"sending design: {params}")
36+
response = session.post("v1/workflow/design/genetic-algorithm", json=params)
37+
return WorkflowDesignJob.model_validate(response.json())
38+
39+
40+
def get_design_results(
41+
session: APISession,
42+
job_id: str,
43+
step: int | None = None,
44+
page_size: int | None = None,
45+
page_offset: int | None = None,
46+
) -> WorkflowDesign:
47+
"""
48+
Retrieves the results of a Design job.
49+
50+
This function retrieves the results of a Design job by making a GET request to design..
51+
52+
Parameters
53+
----------
54+
session : APISession
55+
APIsession with auth
56+
job_id : str
57+
The ID of the job whose results are to be retrieved.
58+
step: int
59+
The step to retrieve. -1 indicates the last step.
60+
page_size : Optional[int], default is None
61+
The number of results to be returned per page. If None, all results are returned.
62+
page_offset : Optional[int], default is None
63+
The number of results to skip. If None, defaults to 0.
64+
65+
Returns
66+
-------
67+
WorkflowDesignJob
68+
The job object representing the Design job.
69+
70+
Raises
71+
------
72+
HTTPError
73+
If the GET request does not succeed.
74+
"""
75+
endpoint = f"v1/workflow/design/{job_id}"
76+
params = {}
77+
if page_size is not None:
78+
params["page_size"] = page_size
79+
if page_offset is not None:
80+
params["page_offset"] = page_offset
81+
if step is not None:
82+
params["step"] = step
83+
84+
response = session.get(endpoint, params=params)
85+
86+
return WorkflowDesign.model_validate(response.json())

0 commit comments

Comments
 (0)