openprotein-python 0.11.1__tar.gz → 0.12.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/PKG-INFO +1 -1
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/__init__.py +1 -0
- openprotein_python-0.12.1/openprotein/embeddings/ablang.py +21 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/api.py +9 -2
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/future.py +37 -20
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/poet2.py +19 -3
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/errors.py +5 -1
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/__init__.py +28 -8
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/alphafold2.py +11 -21
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/api.py +10 -102
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/boltz.py +28 -107
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/common.py +109 -5
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/esmfold.py +3 -3
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/fold.py +3 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/future.py +33 -61
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/minifold.py +8 -4
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/models.py +17 -9
- openprotein_python-0.12.1/openprotein/fold/protenix.py +157 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/rosettafold3.py +10 -20
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/jobs/futures.py +33 -23
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/__init__.py +6 -2
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/foundation/boltzgen.py +25 -46
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/foundation/proteinmpnn.py +29 -6
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/foundation/rfdiffusion.py +23 -46
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/structure_generation.py +26 -4
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/molecules/template.py +6 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/prompt/models.py +10 -3
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/prompt/prompt.py +15 -2
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/utils/chain_id.py +3 -5
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/pyproject.toml +32 -20
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/.gitignore +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/LICENSE.txt +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/README.md +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/_version.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/align/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/align/align.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/align/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/align/future.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/align/msa.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/align/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/align.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/assaydata.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/deprecated/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/deprecated/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/deprecated/poet.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/deprecated/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/deprecated/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/designer.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/embedding.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/error.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/fold.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/job.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/predictor.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/prompt.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/svd.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/api/umap.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/deprecated.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/align/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/align/base.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/align/msa.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/align/prompt.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/assaydata.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/deprecated/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/deprecated/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/deprecated/poet.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/deprecated/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/deprecated/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/designer.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/base.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/esm.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/future.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/openprotein.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/poet.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/poet2.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/embeddings/test.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/fold/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/fold/alphafold2.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/fold/base.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/fold/boltz.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/fold/esmfold.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/fold/future.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/futures.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/predictor/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/predictor/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/predictor/predictor.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/predictor/validate.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/prompt.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/svd.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/models/umap.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/align.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/assaydata.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/deprecated/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/deprecated/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/deprecated/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/deprecated/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/designer.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/embeddings.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/fold.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/job.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/predictor.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/prompt.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/svd.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/app/services/umap.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/base.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/chains.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/common/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/common/features.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/common/model_metadata.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/common/reduction.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/common/residue_contants.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/config.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/csv.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/data/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/data/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/data/assaydataset.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/data/data.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/data/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/design/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/design/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/design/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/design/future.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/design/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/embeddings.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/esm.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/models.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/openprotein.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/poet.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/embeddings/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fasta.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/complex.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/fold/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/jobs/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/jobs/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/jobs/jobs.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/jobs/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/base.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/foundation/boltzgen_schema.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/models/models.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/molecules/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/molecules/chains.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/molecules/complex.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/molecules/protein.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/molecules/structure.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/models.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/prediction.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/predictor.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/predictor/validate.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/prompt/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/prompt/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/prompt/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/protein.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/scaffolds.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/align.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/assaydata.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/deprecated/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/deprecated/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/deprecated/poet.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/deprecated/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/deprecated/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/design.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/designer.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/embeddings.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/features.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/fold.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/job.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/predict.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/predictor.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/prompt.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/svd.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/train.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/schemas/umap.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/svd/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/svd/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/svd/models.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/svd/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/svd/svd.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/umap/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/umap/api.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/umap/models.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/umap/schemas.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/umap/umap.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/utils/__init__.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/utils/cif.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/utils/numpy.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/utils/sequence.py +0 -0
- {openprotein_python-0.11.1 → openprotein_python-0.12.1}/openprotein/utils/uuid.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openprotein-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.1
|
|
4
4
|
Summary: OpenProtein Python interface.
|
|
5
5
|
Author-email: Mark Gee <markgee@ne47.bio>, "Timothy Truong Jr." <ttruong@ne47.bio>, Tristan Bepler <tbepler@ne47.bio>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""AbLang model."""
|
|
2
|
+
|
|
3
|
+
from .models import EmbeddingModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AbLang2Model(EmbeddingModel):
|
|
7
|
+
"""
|
|
8
|
+
Community AbLang2 model that targets antibodies.
|
|
9
|
+
|
|
10
|
+
Examples
|
|
11
|
+
--------
|
|
12
|
+
View specific model details (inc supported tokens) with the `?` operator.
|
|
13
|
+
|
|
14
|
+
.. code-block:: python
|
|
15
|
+
|
|
16
|
+
>>> import openprotein
|
|
17
|
+
>>> session = openprotein.connect(username="user", password="password")
|
|
18
|
+
>>> session.embedding.ablang2?
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
model_id = ["ablang2"]
|
|
@@ -598,9 +598,16 @@ def request_generate_post(
|
|
|
598
598
|
body["seed"] = random_seed
|
|
599
599
|
if kwargs.get("prompt_id"):
|
|
600
600
|
body["prompt_id"] = kwargs["prompt_id"]
|
|
601
|
-
if kwargs.get("
|
|
601
|
+
if kwargs.get("design_id"):
|
|
602
|
+
body["design_id"] = kwargs["design_id"]
|
|
603
|
+
query_id = kwargs.get("query_id")
|
|
604
|
+
if query_id is not None:
|
|
602
605
|
assert model_id != "poet", f"Model with id {model_id} does not support query"
|
|
603
|
-
body["query_id"] =
|
|
606
|
+
body["query_id"] = (
|
|
607
|
+
list(query_id)
|
|
608
|
+
if isinstance(query_id, list)
|
|
609
|
+
else query_id
|
|
610
|
+
)
|
|
604
611
|
if "use_query_structure_in_decoder" in kwargs:
|
|
605
612
|
body["use_query_structure_in_decoder"] = kwargs[
|
|
606
613
|
"use_query_structure_in_decoder"
|
|
@@ -96,8 +96,10 @@ class EmbeddingsResultFuture(MappedFuture[bytes, np.ndarray]):
|
|
|
96
96
|
return api.result_decode(data)
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
Score = namedtuple("Score", ["name", "sequence", "score"])
|
|
100
|
-
|
|
99
|
+
Score = namedtuple("Score", ["name", "sequence", "score", "query_id"])
|
|
100
|
+
Score.__new__.__defaults__ = (None,)
|
|
101
|
+
SingleSiteScore = namedtuple("SingleSiteScore", ["mut_code", "score", "query_id"])
|
|
102
|
+
SingleSiteScore.__new__.__defaults__ = (None,)
|
|
101
103
|
S = TypeVar("S", bound=Union[Score, SingleSiteScore])
|
|
102
104
|
|
|
103
105
|
|
|
@@ -132,13 +134,18 @@ class EmbeddingsScoreFuture(BaseScoreFuture[Score]):
|
|
|
132
134
|
|
|
133
135
|
def stream(self) -> Iterator[Score]:
|
|
134
136
|
stream = api.request_get_score_result(session=self.session, job_id=self.id)
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
header = next(stream)
|
|
138
|
+
has_query_id = len(header) > 0 and header[0].strip().lower() == "query_id"
|
|
137
139
|
for line in stream:
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
if has_query_id:
|
|
141
|
+
query_id = line[0] if line[0] else None
|
|
142
|
+
name, sequence = line[1], line[2]
|
|
143
|
+
scores = np.array([float(s) for s in line[3:]])
|
|
144
|
+
else:
|
|
145
|
+
query_id = None
|
|
146
|
+
name, sequence = line[0], line[1]
|
|
147
|
+
scores = np.array([float(s) for s in line[2:]])
|
|
148
|
+
yield Score(name=name, sequence=sequence, score=scores, query_id=query_id)
|
|
142
149
|
|
|
143
150
|
|
|
144
151
|
class EmbeddingsScoreSingleSiteFuture(BaseScoreFuture[SingleSiteScore]):
|
|
@@ -148,13 +155,18 @@ class EmbeddingsScoreSingleSiteFuture(BaseScoreFuture[SingleSiteScore]):
|
|
|
148
155
|
|
|
149
156
|
def stream(self) -> Iterator[SingleSiteScore]:
|
|
150
157
|
stream = api.request_get_score_result(session=self.session, job_id=self.id)
|
|
151
|
-
|
|
152
|
-
|
|
158
|
+
header = next(stream)
|
|
159
|
+
has_query_id = len(header) > 0 and header[0].strip().lower() == "query_id"
|
|
153
160
|
for line in stream:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
161
|
+
if has_query_id:
|
|
162
|
+
query_id = line[0] if line[0] else None
|
|
163
|
+
mut_code = line[1]
|
|
164
|
+
scores = np.array([float(s) for s in line[2:]])
|
|
165
|
+
else:
|
|
166
|
+
query_id = None
|
|
167
|
+
mut_code = line[0]
|
|
168
|
+
scores = np.array([float(s) for s in line[1:]])
|
|
169
|
+
yield SingleSiteScore(mut_code=mut_code, score=scores, query_id=query_id)
|
|
158
170
|
|
|
159
171
|
|
|
160
172
|
class EmbeddingsGenerateFuture(BaseScoreFuture[Score]):
|
|
@@ -164,13 +176,18 @@ class EmbeddingsGenerateFuture(BaseScoreFuture[Score]):
|
|
|
164
176
|
|
|
165
177
|
def stream(self) -> Iterator[Score]:
|
|
166
178
|
stream = api.request_get_generate_result(session=self.session, job_id=self.id)
|
|
167
|
-
|
|
168
|
-
|
|
179
|
+
header = next(stream)
|
|
180
|
+
has_query_id = len(header) > 0 and header[0].strip().lower() == "query_id"
|
|
169
181
|
for line in stream:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
182
|
+
if has_query_id:
|
|
183
|
+
query_id = line[0] if line[0] else None
|
|
184
|
+
name, sequence = line[1], line[2]
|
|
185
|
+
scores = np.array([float(s) for s in line[3:]])
|
|
186
|
+
else:
|
|
187
|
+
query_id = None
|
|
188
|
+
name, sequence = line[0], line[1]
|
|
189
|
+
scores = np.array([float(s) for s in line[2:]])
|
|
190
|
+
yield Score(name=name, sequence=sequence, score=scores, query_id=query_id)
|
|
174
191
|
|
|
175
192
|
@property
|
|
176
193
|
def sequences(self):
|
|
@@ -20,6 +20,7 @@ from .models import EmbeddingModel
|
|
|
20
20
|
from .poet import PoETModel
|
|
21
21
|
|
|
22
22
|
if TYPE_CHECKING:
|
|
23
|
+
from openprotein.models.structure_generation import StructureGenerationFuture
|
|
23
24
|
from openprotein.predictor import PredictorModel
|
|
24
25
|
from openprotein.svd import SVDModel
|
|
25
26
|
from openprotein.umap import UMAPModel
|
|
@@ -290,7 +291,16 @@ class PoET2Model(PoETModel, EmbeddingModel):
|
|
|
290
291
|
def generate(
|
|
291
292
|
self,
|
|
292
293
|
prompt: str | Prompt | None,
|
|
293
|
-
query:
|
|
294
|
+
query: (
|
|
295
|
+
str
|
|
296
|
+
| bytes
|
|
297
|
+
| Protein
|
|
298
|
+
| Complex
|
|
299
|
+
| Query
|
|
300
|
+
| list[str | bytes | Protein | Complex | Query]
|
|
301
|
+
| None
|
|
302
|
+
) = None,
|
|
303
|
+
design: "str | StructureGenerationFuture | None" = None,
|
|
294
304
|
use_query_structure_in_decoder: bool = True,
|
|
295
305
|
num_samples: int = 100,
|
|
296
306
|
temperature: float = 1.0,
|
|
@@ -308,7 +318,7 @@ class PoET2Model(PoETModel, EmbeddingModel):
|
|
|
308
318
|
----------
|
|
309
319
|
prompt : str or Prompt or None, optional
|
|
310
320
|
Prompt from an align workflow to condition PoET model.
|
|
311
|
-
query : str or bytes or Protein or Complex or Query or None, optional
|
|
321
|
+
query : str or bytes or Protein or Complex or Query or list of these or None, optional
|
|
312
322
|
Query to use with prompt.
|
|
313
323
|
use_query_structure_in_decoder : bool, optional
|
|
314
324
|
Whether to use query structure in decoder. Default is True.
|
|
@@ -340,9 +350,14 @@ class PoET2Model(PoETModel, EmbeddingModel):
|
|
|
340
350
|
EmbeddingsGenerateFuture
|
|
341
351
|
A future object representing the status and information about the generation job.
|
|
342
352
|
"""
|
|
353
|
+
from openprotein.models.structure_generation import StructureGenerationFuture
|
|
354
|
+
|
|
343
355
|
prompt_api = getattr(self.session, "prompt", None)
|
|
344
356
|
assert isinstance(prompt_api, PromptAPI)
|
|
345
|
-
query_id = prompt_api._resolve_query(query=query)
|
|
357
|
+
query_id = prompt_api._resolve_query(query=query) if query is not None else None
|
|
358
|
+
design_id = (
|
|
359
|
+
design.job_id if isinstance(design, StructureGenerationFuture) else design
|
|
360
|
+
)
|
|
346
361
|
if ensemble_weights is not None:
|
|
347
362
|
# NB: for now, ensemble_method is None -> ensemble_method == "arithmetic"
|
|
348
363
|
if ensemble_method is None or (ensemble_method == "arithmetic"):
|
|
@@ -364,6 +379,7 @@ class PoET2Model(PoETModel, EmbeddingModel):
|
|
|
364
379
|
max_length=max_length,
|
|
365
380
|
seed=seed,
|
|
366
381
|
query_id=query_id,
|
|
382
|
+
design_id=design_id,
|
|
367
383
|
use_query_structure_in_decoder=use_query_structure_in_decoder,
|
|
368
384
|
ensemble_weights=ensemble_weights,
|
|
369
385
|
ensemble_method=ensemble_method,
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
from pydantic import BaseModel
|
|
2
2
|
from requests import Response
|
|
3
3
|
|
|
4
|
+
UPGRADE_MESSAGE = (
|
|
5
|
+
"If this issue persists, try upgrading the client: pip install --upgrade openprotein-python"
|
|
6
|
+
)
|
|
7
|
+
|
|
4
8
|
|
|
5
9
|
# Errors for OpenProtein
|
|
6
10
|
class InvalidParameterError(Exception):
|
|
@@ -28,7 +32,7 @@ class APIError(Exception):
|
|
|
28
32
|
"""APIError"""
|
|
29
33
|
|
|
30
34
|
def __init__(self, message: str):
|
|
31
|
-
self.message = message
|
|
35
|
+
self.message = f"{message}\n{UPGRADE_MESSAGE}"
|
|
32
36
|
super().__init__(self.message)
|
|
33
37
|
|
|
34
38
|
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Fold module for predicting structures on OpenProtein.
|
|
3
|
-
|
|
4
|
-
isort:skip_file
|
|
5
3
|
"""
|
|
6
4
|
|
|
7
|
-
from .schemas import FoldJob, FoldMetadata
|
|
8
|
-
from .models import FoldModel
|
|
9
|
-
from .esmfold import ESMFoldModel
|
|
10
|
-
from .minifold import MiniFoldModel
|
|
11
5
|
from .alphafold2 import AlphaFold2Model
|
|
12
6
|
from .boltz import (
|
|
13
7
|
Boltz1Model,
|
|
@@ -18,6 +12,32 @@ from .boltz import (
|
|
|
18
12
|
BoltzConstraint,
|
|
19
13
|
BoltzProperty,
|
|
20
14
|
)
|
|
21
|
-
from .
|
|
22
|
-
from .future import FoldResultFuture
|
|
15
|
+
from .esmfold import ESMFoldModel
|
|
23
16
|
from .fold import FoldAPI
|
|
17
|
+
from .future import FoldResultFuture
|
|
18
|
+
from .minifold import MiniFoldModel
|
|
19
|
+
from .models import FoldModel
|
|
20
|
+
from .protenix import ProtenixConfidence, ProtenixModel
|
|
21
|
+
from .rosettafold3 import RosettaFold3Model
|
|
22
|
+
from .schemas import FoldJob, FoldMetadata
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"FoldJob",
|
|
26
|
+
"FoldMetadata",
|
|
27
|
+
"FoldModel",
|
|
28
|
+
"ESMFoldModel",
|
|
29
|
+
"MiniFoldModel",
|
|
30
|
+
"AlphaFold2Model",
|
|
31
|
+
"ProtenixConfidence",
|
|
32
|
+
"ProtenixModel",
|
|
33
|
+
"Boltz1Model",
|
|
34
|
+
"Boltz1xModel",
|
|
35
|
+
"Boltz2Model",
|
|
36
|
+
"BoltzAffinity",
|
|
37
|
+
"BoltzConfidence",
|
|
38
|
+
"BoltzConstraint",
|
|
39
|
+
"BoltzProperty",
|
|
40
|
+
"RosettaFold3Model",
|
|
41
|
+
"FoldResultFuture",
|
|
42
|
+
"FoldAPI",
|
|
43
|
+
]
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
"""Community-based AlphaFold 2 model running using ColabFold."""
|
|
2
2
|
|
|
3
|
-
import io
|
|
4
3
|
import warnings
|
|
5
|
-
from typing import
|
|
4
|
+
from typing import Sequence
|
|
6
5
|
|
|
7
|
-
from openprotein.align import
|
|
6
|
+
from openprotein.align import MSAFuture
|
|
8
7
|
from openprotein.base import APISession
|
|
9
8
|
from openprotein.common import ModelMetadata
|
|
10
|
-
from openprotein.fold.common import
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
from openprotein.fold.common import (
|
|
10
|
+
msa_future_to_complex,
|
|
11
|
+
normalize_inputs,
|
|
12
|
+
serialize_input,
|
|
13
|
+
)
|
|
14
|
+
from openprotein.molecules import DNA, RNA, Complex, Ligand, Protein
|
|
13
15
|
|
|
14
16
|
from . import api
|
|
15
17
|
from .future import FoldResultFuture
|
|
@@ -33,7 +35,7 @@ class AlphaFold2Model(FoldModel):
|
|
|
33
35
|
|
|
34
36
|
def fold(
|
|
35
37
|
self,
|
|
36
|
-
sequences: Sequence[Complex | Protein | str
|
|
38
|
+
sequences: Sequence[Complex | Protein | str | bytes] | MSAFuture,
|
|
37
39
|
num_recycles: int | None = None,
|
|
38
40
|
num_models: int = 1,
|
|
39
41
|
num_relax: int = 0,
|
|
@@ -44,7 +46,7 @@ class AlphaFold2Model(FoldModel):
|
|
|
44
46
|
|
|
45
47
|
Parameters
|
|
46
48
|
----------
|
|
47
|
-
sequences :
|
|
49
|
+
sequences : Sequence[Complex | Protein | str | bytes] | MSAFuture
|
|
48
50
|
List of protein sequences to include in folded output. `Protein` objects must be tagged with an `msa`, which can be a `Protein.single_sequence_mode` for single sequence mode. Alternatively, supply an `MSAFuture` to use all query sequences as a multimer.
|
|
49
51
|
num_recycles : int
|
|
50
52
|
number of times to recycle models
|
|
@@ -57,7 +59,6 @@ class AlphaFold2Model(FoldModel):
|
|
|
57
59
|
-------
|
|
58
60
|
job : Job
|
|
59
61
|
"""
|
|
60
|
-
from openprotein.align import AlignAPI
|
|
61
62
|
|
|
62
63
|
if "msa" in kwargs:
|
|
63
64
|
warnings.warn(
|
|
@@ -71,18 +72,7 @@ class AlphaFold2Model(FoldModel):
|
|
|
71
72
|
|
|
72
73
|
# build the normalized_models from msa
|
|
73
74
|
if isinstance(sequences, MSAFuture):
|
|
74
|
-
|
|
75
|
-
align_api = getattr(self.session, "align", None)
|
|
76
|
-
assert isinstance(align_api, AlignAPI)
|
|
77
|
-
msa = sequences # rename
|
|
78
|
-
seed = align_api.get_seed(job_id=msa.job.job_id)
|
|
79
|
-
_proteins: dict[str, Protein] = {}
|
|
80
|
-
for seq in seed.split(":"):
|
|
81
|
-
protein = Protein(sequence=seq)
|
|
82
|
-
id = next(id_gen)
|
|
83
|
-
protein.msa = msa.id
|
|
84
|
-
_proteins[id] = protein
|
|
85
|
-
normalized_complexes = [Complex(chains=_proteins)]
|
|
75
|
+
normalized_complexes = [msa_future_to_complex(self.session, sequences)]
|
|
86
76
|
|
|
87
77
|
else:
|
|
88
78
|
normalized_complexes = normalize_inputs(sequences)
|
|
@@ -199,93 +199,21 @@ def fold_get_extra_result(
|
|
|
199
199
|
The result as a numpy array (for "pae", "pde", "plddt") or a list of dictionaries (for "confidence", "affinity").
|
|
200
200
|
"""
|
|
201
201
|
if key in {"pae", "pde", "plddt", "ptm"}:
|
|
202
|
-
formatter = lambda response: np.load(io.BytesIO(response.content))
|
|
203
|
-
elif key in {"confidence", "affinity"}:
|
|
204
|
-
formatter = lambda response: response.json()
|
|
205
|
-
elif key in {"score", "metrics"}:
|
|
206
|
-
import pandas as pd
|
|
207
|
-
|
|
208
|
-
formatter = lambda response: pd.read_csv(io.StringIO(response.content.decode()))
|
|
209
|
-
else:
|
|
210
|
-
raise ValueError(f"Unexpected key: {key}")
|
|
211
|
-
endpoint = PATH_PREFIX + f"/{job_id}/{sequence_or_index}/{key}"
|
|
212
|
-
try:
|
|
213
|
-
response = session.get(
|
|
214
|
-
endpoint,
|
|
215
|
-
)
|
|
216
|
-
except HTTPError as e:
|
|
217
|
-
if e.status_code == 400 and key == "affinity":
|
|
218
|
-
raise ValueError("affinity not found for request") from None
|
|
219
|
-
raise e
|
|
220
|
-
output = formatter(response)
|
|
221
|
-
return output
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
def fold_get_complex_result(
|
|
225
|
-
session: APISession, job_id: str, format: Literal["pdb", "mmcif"]
|
|
226
|
-
) -> bytes:
|
|
227
|
-
"""
|
|
228
|
-
Get encoded result for a complex from the request ID.
|
|
229
202
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
session : APISession
|
|
233
|
-
Session object for API communication.
|
|
234
|
-
job_id : str
|
|
235
|
-
Job ID to retrieve results from.
|
|
236
|
-
format : {'pdb', 'mmcif'}
|
|
237
|
-
Format of the result.
|
|
238
|
-
|
|
239
|
-
Returns
|
|
240
|
-
-------
|
|
241
|
-
bytes
|
|
242
|
-
Encoded result for the complex.
|
|
243
|
-
"""
|
|
244
|
-
endpoint = PATH_PREFIX + f"/{job_id}/complex"
|
|
245
|
-
response = session.get(
|
|
246
|
-
endpoint,
|
|
247
|
-
params={
|
|
248
|
-
"format": format,
|
|
249
|
-
},
|
|
250
|
-
)
|
|
251
|
-
return response.content
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
def fold_get_complex_extra_result(
|
|
255
|
-
session: APISession,
|
|
256
|
-
job_id: str,
|
|
257
|
-
key: Literal[
|
|
258
|
-
"pae", "pde", "plddt", "ptm", "confidence", "affinity", "score", "metrics"
|
|
259
|
-
],
|
|
260
|
-
) -> "np.ndarray | list[dict] | pd.DataFrame":
|
|
261
|
-
"""
|
|
262
|
-
Get extra result for a complex from the request ID.
|
|
263
|
-
|
|
264
|
-
Parameters
|
|
265
|
-
----------
|
|
266
|
-
session : APISession
|
|
267
|
-
Session object for API communication.
|
|
268
|
-
job_id : str
|
|
269
|
-
Job ID to retrieve results from.
|
|
270
|
-
key : {'pae', 'pde', 'plddt', 'ptm', 'confidence', 'affinity', 'score', 'metrics'}
|
|
271
|
-
The type of result to retrieve.
|
|
272
|
-
|
|
273
|
-
Returns
|
|
274
|
-
-------
|
|
275
|
-
numpy.ndarray or list of dict
|
|
276
|
-
The result as a numpy array (for "pae", "pde", "plddt") or a list of dictionaries (for "confidence", "affinity").
|
|
277
|
-
"""
|
|
278
|
-
if key in {"pae", "pde", "plddt", "ptm"}:
|
|
279
|
-
formatter = lambda response: np.load(io.BytesIO(response.content))
|
|
203
|
+
def formatter(response):
|
|
204
|
+
return np.load(io.BytesIO(response.content))
|
|
280
205
|
elif key in {"confidence", "affinity"}:
|
|
281
|
-
|
|
206
|
+
|
|
207
|
+
def formatter(response):
|
|
208
|
+
return response.json()
|
|
282
209
|
elif key in {"score", "metrics"}:
|
|
283
210
|
import pandas as pd
|
|
284
211
|
|
|
285
|
-
formatter
|
|
212
|
+
def formatter(response):
|
|
213
|
+
return pd.read_csv(io.StringIO(response.content.decode()))
|
|
286
214
|
else:
|
|
287
215
|
raise ValueError(f"Unexpected key: {key}")
|
|
288
|
-
endpoint = PATH_PREFIX + f"/{job_id}/
|
|
216
|
+
endpoint = PATH_PREFIX + f"/{job_id}/{sequence_or_index}/{key}"
|
|
289
217
|
try:
|
|
290
218
|
response = session.get(
|
|
291
219
|
endpoint,
|
|
@@ -321,28 +249,8 @@ def fold_models_post(
|
|
|
321
249
|
The outer list represents the batch of requests, and the inner
|
|
322
250
|
list represents the complex, with each item in the list being
|
|
323
251
|
an entity in that complex. A monomer would thus be a single item.
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
num_models : int, optional
|
|
327
|
-
Number of models to generate.
|
|
328
|
-
num_relax : int, optional
|
|
329
|
-
Number of relaxation steps.
|
|
330
|
-
use_potentials : bool, optional
|
|
331
|
-
Whether to use potentials.
|
|
332
|
-
diffusion_samples : int, optional
|
|
333
|
-
Number of diffusion samples (boltz).
|
|
334
|
-
recycling_steps : int, optional
|
|
335
|
-
Number of recycling steps (boltz).
|
|
336
|
-
sampling_steps : int, optional
|
|
337
|
-
Number of sampling steps (boltz).
|
|
338
|
-
step_scale : float, optional
|
|
339
|
-
Step scale (boltz).
|
|
340
|
-
constraints : dict, optional
|
|
341
|
-
Constraints to apply.
|
|
342
|
-
templates : list, optional
|
|
343
|
-
Templates to use.
|
|
344
|
-
properties : dict, optional
|
|
345
|
-
Additional properties.
|
|
252
|
+
**kwargs
|
|
253
|
+
Additional keyword arguments to be sent with POST body.
|
|
346
254
|
|
|
347
255
|
Returns
|
|
348
256
|
-------
|