diff --git a/flake.lock b/flake.lock index a06923c9..9c6ba75b 100644 --- a/flake.lock +++ b/flake.lock @@ -22,18 +22,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1761656231, - "narHash": "sha256-EiED5k6gXTWoAIS8yQqi5mAX6ojnzpHwAQTS3ykeYMg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "e99366c665bdd53b7b500ccdc5226675cfc51f45", - "type": "github" + "lastModified": 1787172299, + "narHash": "sha256-LS/aXgJh+/1UgtrOxdS5Wum/PgmQYa1AMFZHdH+xGyo=", + "rev": "07e1d92cdc0ed416cfa11ff3ca40d17e61cfba7a", + "type": "tarball", + "url": "https://releases.nixos.org/nixpkgs/nixpkgs-26.11pre1058374.07e1d92cdc0e/nixexprs.tar.xz" }, "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "id": "nixpkgs", + "type": "indirect" } }, "root": { diff --git a/flake.nix b/flake.nix index ca23edf0..75a79f99 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { description = "A basic flake with a shell"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + inputs.nixpkgs.url = "nixpkgs"; inputs.systems.url = "github:nix-systems/default"; inputs.flake-utils = { url = "github:numtide/flake-utils"; diff --git a/pixi.lock b/pixi.lock index 779d9ccf..c0fdcc52 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,7 +1,16 @@ version: 7 platforms: - name: linux-64 + virtual-packages: + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=x86_64 - name: osx-arm64 + virtual-packages: + - __unix=0=0 + - __osx=13.0 + - __archspec=0=m1 environments: default: channels: @@ -84,12 +93,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -111,6 +120,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl @@ -204,12 +214,12 @@ environments: - pypi: https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/81/365ceb5ee8a92bd016af3b65398a63cdf4f6999d70b9b30a4fc7bd03a292/sphinx_new_tab_link-0.4.0-py3-none-any.whl @@ -234,6 +244,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl @@ -349,13 +360,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl @@ -382,6 +393,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl @@ -490,13 +502,13 @@ environments: - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/81/365ceb5ee8a92bd016af3b65398a63cdf4f6999d70b9b30a4fc7bd03a292/sphinx_new_tab_link-0.4.0-py3-none-any.whl @@ -526,6 +538,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl @@ -649,7 +662,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/6b/be/0f2f4a5e8adc114a02b63d92bf8edbfa24db6fc602fca83c885af2479e0e/editables-0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl @@ -657,6 +669,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl @@ -689,6 +702,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/bb/4a/2e5583e544bc437d5e8e54b47db87430df9031b29b48d17f26d129fa60c0/trove_classifiers-2026.1.14.14-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl @@ -805,7 +819,6 @@ environments: - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl @@ -815,6 +828,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/8f/81/365ceb5ee8a92bd016af3b65398a63cdf4f6999d70b9b30a4fc7bd03a292/sphinx_new_tab_link-0.4.0-py3-none-any.whl @@ -847,6 +861,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl @@ -2438,19 +2453,6 @@ packages: requires_dist: - anyio>=3.0.0 requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/7e/6b/92d0ec3cb0fa78fbde5b372f381571221db3317f98670bf77e818d470970/openprotein_python-0.14.2-py3-none-any.whl - name: openprotein-python - version: 0.14.2 - sha256: f415eae903ce2cc1ee061e5754e90227eee1f7aed6c6d6c19ea0c599c5aa89aa - requires_dist: - - gemmi>=0.6.0,<0.8 - - numpy>=1.9,<3 - - pandas>=2.2.2,<3 - - pydantic>=2.5,<3 - - requests>=2.32.3,<3 - - tomli>=2.3.0,<3 - - tqdm>=4.66.4,<5 - requires_python: '>=3.10,<3.15' - pypi: https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl name: alabaster version: 1.0.0 @@ -2604,6 +2606,11 @@ packages: - pytest>=6.0.0 ; extra == 'test' - setuptools>=77 ; extra == 'test' requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/88/61/df1d9db18f188d0ae648956a1decadc0e3b77d0571474370fd01f28a82b1/filelock-3.31.1-py3-none-any.whl + name: filelock + version: 3.31.1 + sha256: 9ea33146c780161bf67cb20c7cb26b651566820d65ad8dfdd79422602a2dcfc0 + requires_python: '>=3.10' - pypi: https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl name: pyyaml version: 6.0.3 @@ -3124,6 +3131,20 @@ packages: - docopt ; extra == 'testing' - pytest<9.0.0 ; extra == 'testing' requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/c1/5e/421aa9ba9bbdb215948ac55a0a8724e6e8f1c4fe51d487346da738f1005e/openprotein_python-0.16.0-py3-none-any.whl + name: openprotein-python + version: 0.16.0 + sha256: 104d334dd13c4232dd3ebefa2f6e76c3513eb82f528ea15a13c1922b4d4d1bc8 + requires_dist: + - filelock>=3.13,<4 + - gemmi>=0.6.0,<0.8 + - numpy>=1.9,<3 + - pandas>=2.2.2,<3 + - pydantic>=2.5,<3 + - requests>=2.32.3,<3 + - tomli>=2.3.0,<3 + - tqdm>=4.66.4,<5 + requires_python: '>=3.10,<3.15' - pypi: https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl name: executing version: 2.2.1 diff --git a/pyproject.toml b/pyproject.toml index a57da754..822c364d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ dependencies = [ "sphinx-notfound-page>=1.1.0,<1.2.0", "sphinx-design>=0.6.1,<0.7", # autodoc - "openprotein-python>=0.14.2,<0.15.0", + "openprotein-python>=0.16.0,<0.17.0", "ipython>=9.8.0,<10", # nbsphinx needs ipywidgets to render notebooks containing widget output "ipywidgets>=8.1.0,<9", @@ -39,7 +39,9 @@ channels = ["conda-forge"] platforms = ["linux-64", "osx-arm64"] [tool.pixi.tasks] -build = "sphinx-build source build" +# -W promotes warnings to errors so doc/client-API drift fails the build; +# --keep-going still reports every warning in one pass. +build = "sphinx-build -W --keep-going source build" [tool.pixi.feature.dev.tasks] # install dev version of the client diff --git a/source/_static/js/embeddingsSpec.js b/source/_static/js/embeddingsSpec.js index 5b016dd3..54dbf402 100644 --- a/source/_static/js/embeddingsSpec.js +++ b/source/_static/js/embeddingsSpec.js @@ -3,7 +3,7 @@ const embeddingsSpec = { info: { title: "OpenProtein Embeddings", description: - "# Embeddings API\nThe Embeddings API provided by OpenProtein.ai allows you to generate state-of-the-art protein sequence embeddings from both proprietary and open source models.\n\nYou can list the available models with `/embeddings/models` and view a model summary (including output dimensions, citations and more) with `/embeddings/models/{model_id}/metadata`.\n\nCurrently, we support the following models:\n- **PoET**: An OpenProtein.AI conditional protein language model that enables embedding, scoring, and generating sequences conditioned on an input protein family of interest. [Reference](https://papers.nips.cc/paper_files/paper/2023/hash/f4366126eba252699b280e8f93c0ab2f-Abstract-Conference.html).\n- **PoET-2**: An OpenProtein.AI conditional, multimodal protein language model that enables embedding, scoring, and generating sequences conditioned on an input protein family of interest. [Reference](https://proceedings.neurips.cc/paper_files/paper/2025/hash/4d19160864e6a644496d61b21c7e015a-Abstract-Conference.html).\n- **Prot-seq**: An OpenProtein.AI masked protein language model (~300M parameters) trained on UniRef50 with contact and secondary structure prediction as secondary objectives. This model utilizes random Fourier position embeddings and FlashAttention to enable fast inference.\n- **Rotaprot-large-uniref50w**: An OpenProtein.AI masked protein language model (~900M parameters) trained on UniRef100 with sequences weighted inversely proportional to the number of UniRef50 homologs. This model uses rotary relative position embeddings and FlashAttention to enable fast inference.\n- **Rotaprot-large-uniref90-ft**: A version of our proprietary rotaprot-large-uniref50w finetuned on UniRef100 with sequences weighted inversely proportional to the number of UniRef90 cluster members.\n- **ESM1 Models**: Community based ESM1 models, including: *esm1b_t33_650M_UR50S*, *esm1v_t33_650M_UR90S_1*, *esm1v_t33_650M_UR90S_2*, *esm1v_t33_650M_UR90S_3*, *esm1v_t33_650M_UR90S_4*, *esm1v_t33_650M_UR90S_5*. These are based on the ESM1 language model, with different versions having different model parameters and training data. [GitHub link](https://github.com/facebookresearch/esm), [ESM1b reference](https://www.pnas.org/doi/full/10.1073/pnas.2016239118), [ESM1v reference](https://proceedings.neurips.cc/paper/2021/hash/f51338d736f95dd42427296047067694-Abstract.html). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ESM2 Models**: Community based ESM2 models, including: *esm2_t6_8M_UR50D*, *esm2_t12_35M_UR50D*, *esm2_t30_150M_UR50D*, *esm2_t33_650M_UR50D*. These models are based on the ESM2 language model, with different version having different model parameters and training data. [GitHub link](https://github.com/facebookresearch/esm), [Reference](https://www.science.org/doi/10.1126/science.ade2574). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ESMC Models**: ESM Cambrian (ESMC) protein language models, including: *esmc-300m*, *esmc-600m*, *esmc-6b*. These are trained on UniRef, MGnify, and JGI, with different versions having different model parameters. [GitHub link](https://github.com/Biohub/esm), [Reference](https://biohub.ai/papers/esm_protein.pdf). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ProtTrans Models**: Transformer-based models from RostLab, including: *prot_t5_xl_half_uniref50-enc*. These models are based on the ProtTrans models, with different versions having different transformer-based architectures, model parameters and precisions, as well as different training datasets. [GitHub link](https://github.com/agemagician/ProtTrans), [Reference](https://www.biorxiv.org/content/early/2020/07/21/2020.07.12.199554). Licensed under [Academic Free License v3.0 License](https://choosealicense.com/licenses/afl-3.0/).\n- **AbLang2**: An antibody-specific language model that provides residue-level and sequence-level representations for both heavy and light chains. [GitHub link](https://github.com/oxpig/AbLang2), [Reference](https://doi.org/10.1101/2024.02.02.578678). Licensed under [BSD-3](https://choosealicense.com/licenses/bsd-3-clause/).\n- **ProteinMPNN**: A model for inverse-folding of protein structures to predict suitable sequences. [GitHub link](https://github.com/dauparas/ProteinMPNN), [Reference](https://doi.org/10.1126/science.add2187). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ESM-IF1**: A structure-conditioned inverse-folding model that scores or generates protein sequences given a backbone structure. It has a max sequence length of 500 residues. [GitHub link](https://github.com/facebookresearch/esm), [Reference](https://www.biorxiv.org/content/10.1101/2022.04.10.487779). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n\n", + "# Embeddings API\nThe Embeddings API provided by OpenProtein.ai allows you to generate state-of-the-art protein sequence embeddings from both proprietary and open source models.\n\nYou can list the available models with `/embeddings/models` and view a model summary (including output dimensions, citations and more) with `/embeddings/models/{model_id}/metadata`.\n\nCurrently, we support the following models:\n- **PoET**: An OpenProtein.AI conditional protein language model that enables embedding, scoring, and generating sequences conditioned on an input protein family of interest. [Reference](https://papers.nips.cc/paper_files/paper/2023/hash/f4366126eba252699b280e8f93c0ab2f-Abstract-Conference.html).\n- **PoET-2**: An OpenProtein.AI conditional, multimodal protein language model that enables embedding, scoring, and generating sequences conditioned on an input protein family of interest. [Reference](https://proceedings.neurips.cc/paper_files/paper/2025/hash/4d19160864e6a644496d61b21c7e015a-Abstract-Conference.html).\n- **Prot-seq**: An OpenProtein.AI masked protein language model (~300M parameters) trained on UniRef50 with contact and secondary structure prediction as secondary objectives. This model utilizes random Fourier position embeddings and FlashAttention to enable fast inference.\n- **Rotaprot-large-uniref50w**: An OpenProtein.AI masked protein language model (~900M parameters) trained on UniRef100 with sequences weighted inversely proportional to the number of UniRef50 homologs. This model uses rotary relative position embeddings and FlashAttention to enable fast inference.\n- **Rotaprot-large-uniref90-ft**: A version of our proprietary rotaprot-large-uniref50w finetuned on UniRef100 with sequences weighted inversely proportional to the number of UniRef90 cluster members.\n- **ESM1 Models**: Community based ESM1 models, including: *esm1b_t33_650M_UR50S*, *esm1v_t33_650M_UR90S_1*, *esm1v_t33_650M_UR90S_2*, *esm1v_t33_650M_UR90S_3*, *esm1v_t33_650M_UR90S_4*, *esm1v_t33_650M_UR90S_5*. These are based on the ESM1 language model, with different versions having different model parameters and training data. [GitHub link](https://github.com/facebookresearch/esm), [ESM1b reference](https://www.pnas.org/doi/full/10.1073/pnas.2016239118), [ESM1v reference](https://proceedings.neurips.cc/paper/2021/hash/f51338d736f95dd42427296047067694-Abstract.html). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ESM2 Models**: Community based ESM2 models, including: *esm2_t6_8M_UR50D*, *esm2_t12_35M_UR50D*, *esm2_t30_150M_UR50D*, *esm2_t33_650M_UR50D*. These models are based on the ESM2 language model, with different version having different model parameters and training data. [GitHub link](https://github.com/facebookresearch/esm), [Reference](https://www.science.org/doi/10.1126/science.ade2574). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ESMC Models**: ESM Cambrian (ESMC) protein language models, including: *esmc-300m*, *esmc-600m*, *esmc-6b*. These are trained on UniRef, MGnify, and JGI, with different versions having different model parameters. [GitHub link](https://github.com/Biohub/esm), [Reference](https://biohub.ai/papers/esm_protein.pdf). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ProtTrans Models**: Transformer-based models from RostLab, including: *prot_t5_xl_half_uniref50-enc*. These models are based on the ProtTrans models, with different versions having different transformer-based architectures, model parameters and precisions, as well as different training datasets. [GitHub link](https://github.com/agemagician/ProtTrans), [Reference](https://www.biorxiv.org/content/early/2020/07/21/2020.07.12.199554). Licensed under [Academic Free License v3.0 License](https://choosealicense.com/licenses/afl-3.0/).\n- **AbLang2**: An antibody-specific language model that provides residue-level and sequence-level representations for both heavy and light chains. [GitHub link](https://github.com/oxpig/AbLang2), [Reference](https://doi.org/10.1101/2024.02.02.578678). Licensed under [BSD-3](https://choosealicense.com/licenses/bsd-3-clause/).\n- **ProteinMPNN**: A model for inverse-folding of protein structures to predict suitable sequences. [GitHub link](https://github.com/dauparas/ProteinMPNN), [Reference](https://doi.org/10.1126/science.add2187). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **SolubleMPNN**: A variant of ProteinMPNN trained with weights tuned for soluble protein targets. Uses the same inverse-folding pipeline as ProteinMPNN; `soluble_model` is implied by the route, and `model_name` is restricted to the soluble-compatible weights (`v_48_010`, `v_48_020`). [GitHub link](https://github.com/dauparas/ProteinMPNN), [Reference](https://doi.org/10.1126/science.add2187). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n- **ESM-IF1**: A structure-conditioned inverse-folding model that scores or generates protein sequences given a backbone structure. It has a max sequence length of 500 residues. [GitHub link](https://github.com/facebookresearch/esm), [Reference](https://www.biorxiv.org/content/10.1101/2022.04.10.487779). Licensed under [MIT](https://choosealicense.com/licenses/mit/).\n\n", version: "1.0.0", }, paths: { @@ -94,6 +94,7 @@ const embeddingsSpec = { "poet", "poet-2", "proteinmpnn", + "solublempnn", "esm-if1", "prot-seq", "rotaprot-large-uniref50w", @@ -9967,6 +9968,439 @@ const embeddingsSpec = { ], }, }, + "/api/v1/embeddings/models/solublempnn/generate": { + post: { + tags: ["community", "solublempnn", "generate"], + summary: "solublempnn generate", + description: "Use `solublempnn` to generate sequences based on score.", + requestBody: { + description: "Request generate sequences.", + content: { + "application/json": { + schema: { + title: "GenerateRequest", + description: + "Request for generate sequences using `solublempnn`.", + type: "object", + required: ["n_sequences"], + properties: { + n_sequences: { + title: "Number of Sequences", + type: "integer", + minimum: 1, + default: 100, + example: 100, + }, + query_id: { + type: "string", + format: "uuid", + description: "ID of the uploaded PDB structure", + }, + start_index: { + type: "integer", + description: "Generate start index", + default: 0, + }, + model_name: { + type: "string", + enum: ["v_48_010", "v_48_020"], + default: "v_48_020", + description: + "ProteinMPNN soluble-model version (restricted to soluble-compatible weights)", + }, + ca_only: { + type: "boolean", + description: "Use CA-only model", + }, + temperature: { + type: "number", + format: "float", + default: 0.1, + }, + backbone_noise: { + type: "number", + format: "float", + }, + chains_to_design: { + type: "array", + items: { + type: "string", + }, + }, + fixed_positions: { + type: "array", + items: { + type: "array", + items: { + type: "integer", + }, + }, + }, + omit_aas_global: { + type: "array", + items: { + type: "string", + }, + }, + omit_aas_per_chain_position: { + type: "object", + additionalProperties: { + type: "array", + items: { + type: "object", + properties: { + positions: { + type: "array", + items: { + type: "integer", + }, + }, + aas: { + type: "string", + }, + }, + }, + }, + }, + aa_bias_global: { + type: "object", + additionalProperties: { + type: "number", + format: "float", + }, + }, + aa_bias_per_position: { + type: "object", + additionalProperties: { + type: "array", + items: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + }, + }, + pssm: { + type: "object", + additionalProperties: { + type: "object", + properties: { + pssm_coef: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + pssm_bias: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + pssm_log_odds: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + }, + }, + }, + pssm_multi: { + type: "number", + format: "float", + }, + pssm_threshold: { + type: "number", + format: "float", + }, + pssm_log_odds: { + type: "boolean", + }, + pssm_bias: { + type: "boolean", + }, + tie_positions: { + type: "array", + items: { + type: "array", + items: { + type: "integer", + }, + }, + }, + score_only: { + type: "boolean", + }, + input_sequences: { + type: "array", + items: { + type: "string", + }, + description: "Required if score_only is true", + }, + probabilities_output_mode: { + type: "string", + enum: [ + "none", + "per_position", + "conditional", + "conditional_backbone", + "unconditional", + ], + }, + }, + }, + }, + "multipart/form-data": { + schema: { + title: "GenerateRequest", + description: + "Request for generate sequences using `solublempnn`.", + type: "object", + required: ["n_sequences"], + properties: { + n_sequences: { + title: "Number of Sequences", + type: "integer", + minimum: 1, + default: 100, + example: 100, + }, + query_id: { + type: "string", + format: "uuid", + description: "ID of the uploaded PDB structure", + }, + start_index: { + type: "integer", + description: "Generate start index", + default: 0, + }, + model_name: { + type: "string", + enum: ["v_48_010", "v_48_020"], + default: "v_48_020", + description: + "ProteinMPNN soluble-model version (restricted to soluble-compatible weights)", + }, + ca_only: { + type: "boolean", + description: "Use CA-only model", + }, + temperature: { + type: "number", + format: "float", + default: 0.1, + }, + backbone_noise: { + type: "number", + format: "float", + }, + chains_to_design: { + type: "array", + items: { + type: "string", + }, + }, + fixed_positions: { + type: "array", + items: { + type: "array", + items: { + type: "integer", + }, + }, + }, + omit_aas_global: { + type: "array", + items: { + type: "string", + }, + }, + omit_aas_per_chain_position: { + type: "object", + additionalProperties: { + type: "array", + items: { + type: "object", + properties: { + positions: { + type: "array", + items: { + type: "integer", + }, + }, + aas: { + type: "string", + }, + }, + }, + }, + }, + aa_bias_global: { + type: "object", + additionalProperties: { + type: "number", + format: "float", + }, + }, + aa_bias_per_position: { + type: "object", + additionalProperties: { + type: "array", + items: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + }, + }, + pssm: { + type: "object", + additionalProperties: { + type: "object", + properties: { + pssm_coef: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + pssm_bias: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + pssm_log_odds: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + }, + }, + }, + pssm_multi: { + type: "number", + format: "float", + }, + pssm_threshold: { + type: "number", + format: "float", + }, + pssm_log_odds: { + type: "boolean", + }, + pssm_bias: { + type: "boolean", + }, + tie_positions: { + type: "array", + items: { + type: "array", + items: { + type: "integer", + }, + }, + }, + score_only: { + type: "boolean", + }, + input_sequences: { + type: "array", + items: { + type: "string", + }, + description: "Required if score_only is true", + }, + probabilities_output_mode: { + type: "string", + enum: [ + "none", + "per_position", + "conditional", + "conditional_backbone", + "unconditional", + ], + }, + }, + }, + }, + }, + required: true, + }, + responses: { + 202: { + description: "Generate request created and pending", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/GenerateJob", + }, + }, + }, + }, + 400: { + description: "Validation errors in the submitted request.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Model not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 422: { + description: + "Unexpected request format. The submitted request body cannot be validated. Double check the schema.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/ValidationError", + }, + }, + }, + }, + 429: { + description: "Too many requests. Try again later.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, "/api/v1/embeddings/models/esm-if1/generate": { post: { tags: ["community", "esm-if1", "generate"], @@ -10879,6 +11313,10 @@ const embeddingsSpec = { name: "proteinmpnn", description: "proteinmpnn", }, + { + name: "solublempnn", + description: "solublempnn", + }, ], }; export default embeddingsSpec; diff --git a/source/_static/js/foldSpec.js b/source/_static/js/foldSpec.js index 6f4ec92c..67d191be 100644 --- a/source/_static/js/foldSpec.js +++ b/source/_static/js/foldSpec.js @@ -240,7 +240,7 @@ const foldSpec = { tags: ["fold requests", "esmfold2"], summary: "ESMFold2", description: - "Create structure prediction using ESMFold2, an all-atom structure prediction\nmodel. Folds protein/DNA/RNA/ligand complexes, optionally conditioned on an MSA.\n\nArgs:\n - `sequences`: List of chain/molecule entities in the input. Each entry describes a protein, nucleic acid, or ligand, including its sequence, identifier(s), and optional attributes such as msa_id, SMILES string, CCD code.\n - `msa_id` should refer to the id of an msa job which included this protein as a query, or `null` for single sequence mode.\n - `smiles` and `ccd` are mutually exclusive for ligands.\n - `diffusion_samples`: Number of diffusion samples to use. Controls how many independent structure samples are generated per input. Default is 1.\n - `num_steps`: Number of sampling steps to use. Sets the number of steps in the diffusion process for each sample. Default is 200.\n - `num_recycles`: Number of recycling steps to use. Determines how many times the model refines its prediction iteratively. Default is 3.\n - `seed`: Random seed for reproducible sampling. `null` lets the system decide.", + "Create structure prediction using ESMFold2, an all-atom structure prediction\nmodel. Folds protein/DNA/RNA/ligand complexes, optionally conditioned on an MSA.\n\nArgs:\n - `sequences`: List of chain/molecule entities in the input. Each entry describes a protein, nucleic acid, or ligand, including its sequence, identifier(s), and optional attributes such as msa_id, SMILES string, CCD code.\n - `msa_id` should refer to the id of an msa job which included this protein as a query, or `null` for single sequence mode.\n - `smiles` and `ccd` are mutually exclusive for ligands.\n - `diffusion_samples`: Number of diffusion samples to use. Controls how many independent structure samples are generated per input. Default is 1.\n - `num_steps`: Number of sampling steps to use. Sets the number of steps in the diffusion process for each sample. Default is 100.\n - `num_recycles`: Number of recycling steps to use. Determines how many times the model refines its prediction iteratively. Default is 3.\n - `seed`: Random seed for reproducible sampling. `null` lets the system decide.", requestBody: { description: "Request for structure prediction.", content: { @@ -328,7 +328,7 @@ const foldSpec = { tags: ["fold requests", "esmfold2"], summary: "ESMFold2-Fast", description: - "Create structure prediction using ESMFold2-Fast, an inference-optimized\nsingle-sequence variant of ESMFold2 whose folding trunk has half the depth\n(24 vs 48 layers). Folds protein/DNA/RNA/ligand complexes.\n\nUnlike ESMFold2, ESMFold2-Fast is single-sequence only and does not accept\nan MSA (`msa_id`).\n\nArgs:\n - `sequences`: List of chain/molecule entities in the input. Each entry describes a protein, nucleic acid, or ligand, including its sequence, identifier(s), and optional attributes such as SMILES string, CCD code.\n - `smiles` and `ccd` are mutually exclusive for ligands.\n - `diffusion_samples`: Number of diffusion samples to use. Controls how many independent structure samples are generated per input. Default is 1.\n - `num_steps`: Number of sampling steps to use. Sets the number of steps in the diffusion process for each sample. Default is 200.\n - `num_recycles`: Number of recycling steps to use. Determines how many times the model refines its prediction iteratively. Default is 3.\n - `seed`: Random seed for reproducible sampling. `null` lets the system decide.", + "Create structure prediction using ESMFold2-Fast, an inference-optimized\nsingle-sequence variant of ESMFold2 whose folding trunk has half the depth\n(24 vs 48 layers). Folds protein/DNA/RNA/ligand complexes.\n\nUnlike ESMFold2, ESMFold2-Fast is single-sequence only and does not accept\nan MSA (`msa_id`).\n\nArgs:\n - `sequences`: List of chain/molecule entities in the input. Each entry describes a protein, nucleic acid, or ligand, including its sequence, identifier(s), and optional attributes such as SMILES string, CCD code.\n - `smiles` and `ccd` are mutually exclusive for ligands.\n - `diffusion_samples`: Number of diffusion samples to use. Controls how many independent structure samples are generated per input. Default is 1.\n - `num_steps`: Number of sampling steps to use. Sets the number of steps in the diffusion process for each sample. Default is 100.\n - `num_recycles`: Number of recycling steps to use. Determines how many times the model refines its prediction iteratively. Default is 3.\n - `seed`: Random seed for reproducible sampling. `null` lets the system decide.", requestBody: { description: "Request for structure prediction.", content: { @@ -2006,7 +2006,7 @@ const foldSpec = { type: "integer", description: "Number of sampling steps to use.", minimum: 1, - default: 200, + default: 100, }, num_recycles: { type: "integer", @@ -2047,7 +2047,7 @@ const foldSpec = { ], ], diffusion_samples: 1, - num_steps: 200, + num_steps: 100, num_recycles: 3, }, }, @@ -2091,7 +2091,7 @@ const foldSpec = { type: "integer", description: "Number of sampling steps to use.", minimum: 1, - default: 200, + default: 100, }, num_recycles: { type: "integer", @@ -2131,7 +2131,7 @@ const foldSpec = { ], ], diffusion_samples: 1, - num_steps: 200, + num_steps: 100, num_recycles: 3, }, }, diff --git a/source/_static/js/getSwaggerJson.js b/source/_static/js/getSwaggerJson.js index 52378954..a49b39a2 100644 --- a/source/_static/js/getSwaggerJson.js +++ b/source/_static/js/getSwaggerJson.js @@ -199,75 +199,97 @@ const prodFetchUrls = { export default async function getSwaggerJson(swaggerType) { let apiPathToShow = []; let apiSchemasToShow = []; - let swagerSpecs = {}; + let swaggerSpecs = {}; const environment = getEnvironment(); const fetchUrls = environment === "dev" ? devFetchUrls : prodFetchUrls; if (swaggerType === "project") { // get the full swagger specs - swagerSpecs = await (await fetch(fetchUrls.projectUrl)).json(); + swaggerSpecs = await (await fetch(fetchUrls.projectUrl)).json(); // update variables according to the swagger type apiPathToShow = apiPathProject; apiSchemasToShow = apiSchemasProject; - swagerSpecs.tags = apiTagsProject; + swaggerSpecs.tags = apiTagsProject; } if (swaggerType === "align") { // get the full swagger specs - swagerSpecs = await (await fetch(fetchUrls.projectUrl)).json(); + swaggerSpecs = await (await fetch(fetchUrls.projectUrl)).json(); // update variables according to the swagger type apiPathToShow = apiPathAlign; apiSchemasToShow = apiSchemasAlign; - swagerSpecs.tags = apiTagsAlign; + swaggerSpecs.tags = apiTagsAlign; } else if (swaggerType === "poet") { // get the full swagger specs - swagerSpecs = await (await fetch(fetchUrls.poetUrl)).json(); + swaggerSpecs = await (await fetch(fetchUrls.poetUrl)).json(); // update variables according to the swagger type apiPathToShow = apiPathPoet; apiSchemasToShow = apiSchemasPoet; - swagerSpecs.tags = apiTagsPoet; + swaggerSpecs.tags = apiTagsPoet; } else if (swaggerType === "auth") { // get the full swagger specs - swagerSpecs = await (await fetch(fetchUrls.authUrl)).json(); + swaggerSpecs = await (await fetch(fetchUrls.authUrl)).json(); // update variables according to the swagger type apiPathToShow = apiPathAuth; apiSchemasToShow = apiSchemasAuth; - swagerSpecs.tags = apiTagsAuth; + swaggerSpecs.tags = apiTagsAuth; } else if (swaggerType === "embeddings") { // get the full swagger specs - swagerSpecs = await (await fetch(fetchUrls.embeddingsUrl)).json(); - return swagerSpecs; + swaggerSpecs = await (await fetch(fetchUrls.embeddingsUrl)).json(); + return swaggerSpecs; } else if (swaggerType === "prompt") { // The prompt service exports its own (prompt-only) spec, so there is // nothing to filter — fetch and return it as-is. Includes the dynamic // per-system-prompt routes whenever the backend DB is seeded. - swagerSpecs = await (await fetch(fetchUrls.promptUrl)).json(); - return swagerSpecs; + swaggerSpecs = await (await fetch(fetchUrls.promptUrl)).json(); + return swaggerSpecs; + } else if (swaggerType === "models") { + // Served from the main service. Rather than curating explicit path/schema + // allowlists, just keep the models module's routes (everything under + // /api/v1/models). + swaggerSpecs = await (await fetch(fetchUrls.projectUrl)).json(); + const modelsPaths = {}; + const usedTags = new Set(); + for (const pathKey in swaggerSpecs.paths) { + if (!pathKey.startsWith("/api/v1/models")) continue; + const pathItem = swaggerSpecs.paths[pathKey]; + modelsPaths[pathKey] = pathItem; + for (const method in pathItem) { + (pathItem[method].tags || []).forEach((t) => usedTags.add(t)); + } + } + swaggerSpecs.paths = modelsPaths; + // Keep only the tags used by the models routes so the other main-service + // tag sections don't render. + if (Array.isArray(swaggerSpecs.tags)) { + swaggerSpecs.tags = swaggerSpecs.tags.filter((t) => usedTags.has(t.name)); + } + return swaggerSpecs; } const filteredPathsToShow = {}; - for (const pathKey in swagerSpecs.paths) { + for (const pathKey in swaggerSpecs.paths) { apiPathToShow.forEach((pathToShow) => { if (pathToShow === pathKey) { - filteredPathsToShow[pathToShow] = swagerSpecs.paths[pathToShow]; + filteredPathsToShow[pathToShow] = swaggerSpecs.paths[pathToShow]; } }); } - swagerSpecs.paths = filteredPathsToShow; + swaggerSpecs.paths = filteredPathsToShow; const filteredSchemasToShow = {}; - for (const schemaKey in swagerSpecs.components.schemas) { + for (const schemaKey in swaggerSpecs.components.schemas) { apiSchemasToShow.forEach((schemaKeyToShow) => { if (schemaKeyToShow === schemaKey) { filteredSchemasToShow[schemaKeyToShow] = - swagerSpecs.components.schemas[schemaKeyToShow]; + swaggerSpecs.components.schemas[schemaKeyToShow]; } }); } - swagerSpecs.components.schemas = filteredSchemasToShow; + swaggerSpecs.components.schemas = filteredSchemasToShow; - return swagerSpecs; + return swaggerSpecs; } diff --git a/source/_static/js/predictorSpec.js b/source/_static/js/predictorSpec.js index f4955fde..6e061803 100644 --- a/source/_static/js/predictorSpec.js +++ b/source/_static/js/predictorSpec.js @@ -1450,7 +1450,15 @@ const predictorSpec = { type: { type: "string", description: "Type of kernel to use with GP.", - enum: ["linear", "rbf", "matern21", "matern32"], + enum: [ + "linear", + "rbf", + "matern12", + "matern32", + "matern52", + "periodic", + "rational_quadratic", + ], example: "rbf", }, multitask: { @@ -1459,6 +1467,20 @@ const predictorSpec = { example: true, default: false, }, + period: { + type: "number", + format: "double", + description: + "Period length for the periodic kernel. Only valid when type is periodic.", + example: 1, + }, + alpha: { + type: "number", + format: "double", + description: + "Scale-mixture parameter for the rational_quadratic kernel; must be > 0. Only valid when type is rational_quadratic.", + example: 1, + }, }, }, TrainRequestGP: { diff --git a/source/_static/js/promptSpec.js b/source/_static/js/promptSpec.js new file mode 100644 index 00000000..d2e009a2 --- /dev/null +++ b/source/_static/js/promptSpec.js @@ -0,0 +1,1683 @@ +const promptSpec = { + openapi: "3.0.2", + info: { + title: "OpenProtein Prompt", + description: + "# Prompt API\nThe Prompt API provided by OpenProtein.ai allows you to construct and upload prompts to use with our PoET models.\n", + version: "1.0.0", + }, + paths: { + "/api/v1/prompt/create_prompt": { + post: { + tags: ["Prompt"], + summary: "Create a prompt", + description: + "Create a prompt with provided context and query.\n\nThis endpoint accepts a list of files as context.\n", + operationId: "createPrompt", + requestBody: { + required: true, + content: { + "multipart/form-data": { + schema: { + type: "object", + required: ["context"], + properties: { + name: { + type: "string", + }, + description: { + type: "string", + nullable: true, + default: null, + }, + project_uuid: { + type: "string", + format: "uuid", + description: + "Optional project UUID to attach the prompt to.", + }, + context: { + type: "array", + items: { + type: "string", + format: "binary", + }, + description: + "A list of zip files, where the i'th file specifies the data\nfor the i'th context in the prompt. Each zip file may\ncontain: \n - fasta files containing lists of sequences\n - cif structure files\nThe file extensions of the zipped files have to match.\n", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "Prompt created successfully.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/PromptMetadata", + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt": { + get: { + tags: ["Prompt"], + summary: "List prompts", + description: "List prompts available.\n", + operationId: "listPrompts", + parameters: [ + { + name: "project_uuid", + in: "query", + description: "Optional project UUID to filter prompts by.", + required: false, + schema: { + type: "string", + format: "uuid", + }, + }, + { + name: "scope", + in: "query", + description: + "Restrict the listing to the caller's own prompts (`mine`, the\ndefault), platform system prompts (`system`), or both (`all`).", + required: false, + schema: { + type: "string", + enum: ["mine", "system", "all"], + default: "mine", + }, + }, + { + name: "search", + in: "query", + description: + "Case-insensitive substring matched against prompt name and description.", + required: false, + schema: { + type: "string", + }, + }, + { + name: "page_size", + in: "query", + description: "Maximum number of prompts to return.", + required: false, + schema: { + type: "integer", + default: 1024, + }, + }, + { + name: "page_offset", + in: "query", + description: "Number of prompts to skip before returning results.", + required: false, + schema: { + type: "integer", + default: 0, + }, + }, + ], + responses: { + 200: { + description: "List of prompts", + content: { + "application/json": { + schema: { + description: "List of prompts", + type: "array", + items: { + $ref: "#/components/schemas/PromptMetadata", + }, + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/query": { + get: { + tags: ["Query"], + summary: "List queries", + description: "List queries available.\n", + operationId: "listQueries", + parameters: [ + { + name: "project_uuid", + in: "query", + description: "Optional project UUID to filter queries by.", + required: false, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + responses: { + 200: { + description: "List of queries", + content: { + "application/json": { + schema: { + description: "List of queries", + type: "array", + items: { + $ref: "#/components/schemas/QueryMetadata", + }, + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + post: { + tags: ["Query"], + summary: "Create a query", + description: + "Create a query to be used to augment prompts for queries.\n\nThis endpoint accepts a single file as a query.\n", + operationId: "createQuery", + requestBody: { + required: true, + content: { + "multipart/form-data": { + schema: { + type: "object", + required: ["query"], + properties: { + project_uuid: { + type: "string", + format: "uuid", + description: + "Optional project UUID to attach the query to.", + }, + query: { + type: "string", + format: "binary", + description: + "A file specifying the query.\nThe file may be a specify a sequence (fasta) or a\nstructure (cif). The file extension have to match.\n", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "Query created successfully.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/QueryMetadata", + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/query/{query_id}": { + get: { + tags: ["Query"], + summary: "Get query metadata", + description: "Get metadata of a query.", + parameters: [ + { + name: "query_id", + in: "path", + description: "Query ID to fetch metadata", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + operationId: "getQueryMetadata", + responses: { + 200: { + description: "The metadata of the query.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/QueryMetadata", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Query not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + put: { + tags: ["Query"], + summary: "Update query metadata", + description: + "Update the project attachment of a query.\n\nOnly the fields provided in the request body are changed; fields that\nare omitted retain their existing value. Nullable fields may be cleared\nby passing an explicit null value.", + parameters: [ + { + name: "query_id", + in: "path", + description: "Query ID to update", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + operationId: "updateQuery", + requestBody: { + description: "Fields to update on the query.", + required: true, + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/QueryUpdate", + }, + }, + }, + }, + responses: { + 200: { + description: "The updated query metadata.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/QueryMetadata", + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Query not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/query/{query_id}/content": { + get: { + tags: ["Query"], + summary: "Get query content", + description: + "Get content of query by downloading the uploaded query file.", + parameters: [ + { + name: "query_id", + in: "path", + description: "Query ID to fetch", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + operationId: "getQuery", + responses: { + 200: { + description: + "The query file in either fasta or cif format depending on whether a sequence or structure was uploaded.", + content: { + "text/x-fasta": { + schema: { + type: "string", + format: "binary", + example: "", + }, + }, + "chemical/x-mmcif": { + schema: { + type: "string", + format: "binary", + example: "", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Query not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/{prompt_id}": { + get: { + tags: ["Prompt"], + summary: "Get prompt metadata", + description: "Get metadata of a prompt.", + parameters: [ + { + name: "prompt_id", + in: "path", + description: "Prompt ID to fetch metadata", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + operationId: "getPromptMetadata", + responses: { + 200: { + description: "The metadata of the prompt.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/PromptMetadata", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Prompt not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + put: { + tags: ["Prompt"], + summary: "Update prompt metadata", + description: + "Update the name, description, or project attachment of a prompt.\n\nOnly the fields provided in the request body are changed; fields that\nare omitted retain their existing value. Nullable fields may be cleared\nby passing an explicit null value.", + parameters: [ + { + name: "prompt_id", + in: "path", + description: "Prompt ID to update", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + operationId: "updatePrompt", + requestBody: { + description: "Fields to update on the prompt.", + required: true, + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/PromptUpdate", + }, + }, + }, + }, + responses: { + 200: { + description: "The updated prompt metadata.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/PromptMetadata", + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 403: { + description: + "The target prompt is a platform system prompt and cannot be modified.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Prompt not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/{prompt_id}/content": { + get: { + tags: ["Prompt"], + summary: "Get prompt content", + description: + "Get content of prompt by downloading the uploaded context files in a single zip.", + parameters: [ + { + name: "prompt_id", + in: "path", + description: "Prompt ID to fetch", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + operationId: "getPrompt", + responses: { + 200: { + description: + "The prompt containing the context files in a zip file.", + content: { + "application/zip": { + schema: { + type: "string", + format: "binary", + example: "", + }, + }, + }, + }, + 401: { + description: + "Bad or expired token. This can happen if the token is revoked or expired. User should re-authenticate with their credentials.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Prompt not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/edit_protein": { + post: { + tags: ["Structure"], + summary: "Edit protein structure", + description: + 'Edit a Protein object by specifying aligned reference and new sequences, and a structure mask.\nHandles insertions, deletions, point mutations, and structure masking.\n\n**Advanced Multi-File Support:**\nInstead of passing a single `protein` file, you may supply multiple files into the `structures` array\nand provide a `config` JSON string to control how they are edited and grouped. By using `config`,\nyou can:\n- Construct 3D rigid bodies (groups) from multiple disparate chains.\n- Introduce sequence-only chains.\n- Rename chain IDs dynamically to avoid collisions natively.\n- Apply unique sequences, structure masks, binding tracks, and pLDDT overrides to any chains within the group structure.\n\nExample `config` JSON payload:\n```json\n{\n "groups": [\n {\n "structures": [\n {\n "file_index": 0,\n "chain_ids": {"A": "X", "B": "Y"},\n "edits": {\n "X": {\n "reference_sequence": "ACDEFG",\n "new_sequence": "ACHEFG",\n "structure_mask": "SSXSSS",\n "binding": "UUBUUU",\n "plddt": 72.5\n }\n }\n }\n ],\n "sequences": [\n {\n "sequence": "ACDEF",\n "chain_id": "Z"\n }\n ]\n }\n ]\n}\n```\n\n**Config Field Details:**\n- **`groups`**: An array where each item defines a rigid-body group. All structures and sequences within the same group will have their relative positions fixed.\n- **`file_index`**: The integer index of the file in the `structures` array. `0` refers to the first file uploaded.\n- **`chain_ids` (optional)**: Renames chains from the input structure. A mapping of `{"original_id": "new_id"}`.\n If provided, this acts as an **explicit inclusion list**: only chains mapped here will be extracted.\n Unmapped chains are ignored. Map a chain to itself (e.g., `{"A": "A"}`) to keep it without renaming.\n- **`edits` (optional)**: Specifies modifications to be applied to specific chains (by their assigned ID). Each chain edit can describe all residue-level outputs for that chain:\n - **Sequence edit** via `reference_sequence` and `new_sequence`\n - **Structure edit** via `structure_mask`\n - **Binding edit** via `binding`, an aligned string using `B` (binding), `N` (not binding), `U` (unknown), and `-` (deleted / no residue)\n - **pLDDT override** via `plddt`, a scalar from `0` to `100` applied to final residues with known CA coordinates. Residues without structure keep `NaN`.\n- **`sequences`**: Used to supply sequence-only protein chains directly as strings without a structure file.\n\nLegacy single-file usage (via `protein`, `reference_sequence`, `new_sequence`, and `structure_mask`) remains fully supported if `config` and `structures` are omitted.\n', + operationId: "editProteinStructure", + requestBody: { + required: true, + content: { + "multipart/form-data": { + schema: { + type: "object", + properties: { + protein: { + type: "string", + format: "binary", + description: "CIF file containing the protein structure.", + }, + reference_sequence: { + type: "string", + description: 'Reference sequence (may include "-").', + }, + new_sequence: { + type: "string", + description: 'New sequence (may include "-").', + }, + structure_mask: { + type: "string", + description: 'String of "S" and "X" for structure masking.', + }, + structures: { + type: "array", + items: { + type: "string", + format: "binary", + }, + description: + "Array of CIF or PDB files containing protein structures.", + }, + config: { + description: "Configuration for groups and edits.", + allOf: [ + { + $ref: "#/components/schemas/EditProteinConfig", + }, + ], + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "Edited protein CIF file", + content: { + "chemical/x-mmcif": { + schema: { + type: "string", + format: "binary", + }, + }, + }, + }, + 400: { + description: "Invalid input", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/extract_chain": { + post: { + tags: ["Structure"], + summary: "Extract chain", + description: "Extract chain from protein complex.\n", + operationId: "extractChain", + requestBody: { + required: true, + content: { + "multipart/form-data": { + schema: { + type: "object", + properties: { + protein: { + type: "string", + format: "binary", + description: "CIF file containing the protein complex.", + }, + chain_id: { + type: "string", + description: "Chain ID to extract from protein file.", + }, + use_bfactor_as_plddt: { + type: "boolean", + description: "Use bfactor as pLDDT.", + }, + }, + required: ["protein", "chain_id", "use_bfactor_as_plddt"], + }, + }, + }, + }, + responses: { + 200: { + description: "Extracted protein as CIF file.", + content: { + "chemical/x-mmcif": { + schema: { + type: "string", + format: "binary", + }, + }, + }, + }, + 400: { + description: "Invalid input", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/normalize_structure": { + post: { + tags: ["Structure"], + summary: "Normalize a protein structure file", + description: + "Normalize a protein structure by converting it into standardized CIF format.\nSupports input in both PDB and CIF formats.", + operationId: "normalizeStructure", + requestBody: { + required: true, + content: { + "multipart/form-data": { + schema: { + type: "object", + required: ["protein"], + properties: { + protein: { + type: "string", + format: "binary", + description: "Protein structure file in PDB or CIF format.", + }, + plddt: { + type: "string", + description: + "Optional scalar pLDDT override applied to all atoms in the normalized CIF output. Provide a number between 0 and 100 inclusive.", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "Normalized protein CIF file.", + content: { + "chemical/x-mmcif": { + schema: { + type: "string", + format: "binary", + }, + }, + }, + }, + 400: { + description: "Invalid input", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/sequence_align_batch": { + post: { + tags: ["Align"], + summary: + "Batch sequence alignment and identity computation (Streaming)", + description: + "Align the query sequence against each target sequence using pairwise alignment\nand compute sequence identity.\n\n**Streaming Endpoint:** Returns a stream of JSON objects (NDJSON), where each line\ncorresponds to one target sequence in the order provided.", + operationId: "sequenceAlignBatch", + requestBody: { + required: true, + content: { + "application/json": { + schema: { + type: "object", + required: ["query_sequence", "target_sequences"], + properties: { + query_sequence: { + type: "string", + description: + "Query protein sequence (single-letter amino acid codes).\nUse `:` to separate chains of a multichain query; target sequences\nmust then have the same number of chains, aligned chain-by-position.", + }, + target_sequences: { + type: "array", + items: { + type: "string", + }, + description: + "List of target protein sequences. Each entry may be multichain\nusing `:` separators; its chain count must match the query.", + }, + return_alignment: { + type: "boolean", + description: + "Whether to return aligned query and target sequences as tuples.", + default: false, + }, + }, + }, + example: { + query_sequence: "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQ", + target_sequences: [ + "MKTAYIAKQRQISFVKSHFSRQLDERLGLIEVQ", + "ARNMKTAYIAKQRQISYVKSHFSRQLDERLGLIEVQ", + ], + return_alignment: true, + }, + }, + }, + }, + responses: { + 200: { + description: + "Stream of sequence identities (and optionally alignments).\nEach line is a JSON object representing the result for a single target.", + content: { + "application/x-ndjson": { + schema: { + type: "object", + properties: { + identity: { + type: "number", + format: "float", + description: + "Sequence identity for this target, normalized to alignment length (0-1).", + }, + alignment: { + type: "array", + items: { + type: "string", + }, + description: + "Tuple of (aligned_query_sequence, aligned_target_sequence).\nFor multichain inputs, chains are joined with `:` within each\naligned string in the same order as the query chains.\nPresent if `return_alignment=true`.", + }, + }, + example: { + identity: 0.97, + alignment: [ + "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQ", + "MKTAYIAKQRQISFVKSHFSRQLDERLGLIEVQ", + ], + }, + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: "Unauthorized.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/structure_align_batch_by_id": { + post: { + tags: ["Align"], + summary: "Batch structure alignment using specified method (Streaming)", + description: + "Perform structure-based alignment between query structures and targets.\n\nExactly one of `protein` or `design_id` must be provided as the query.\nWhen `design_id` is given, it references a fold job with N design\nstructures, and `targets_id` must contain a positive multiple of N\nstructures. Design `i` is aligned against `targets[i*k : (i+1)*k]`\nwhere `k = len(targets) / len(designs)`. Each result row carries a\n`design_index` (0-indexed) so callers can regroup the stream.\n\n**Streaming Endpoint:** Returns a stream of JSON objects (NDJSON), where each line\ncorresponds to one (query, target) pair.", + operationId: "structureAlignBatchById", + requestBody: { + required: true, + content: { + "multipart/form-data": { + schema: { + type: "object", + required: [ + "targets_id", + "method", + "return_transform", + "return_alignment", + "return_identities", + "return_plddt", + ], + properties: { + protein: { + type: "string", + format: "binary", + description: + "CIF or PDB file containing the query structure. All protein\nchains in the file are used; non-protein chains are filtered\nor rejected per the service's `REJECT_NON_PROTEIN_CHAINS`\nsetting. Targets must have matching chain ids.\nMutually exclusive with `design_id`; exactly one of the two\nmust be provided.", + }, + design_id: { + type: "string", + format: "uuid", + description: + "Fold job ID referencing a **collection** of N query\nstructures (e.g. designs from RFdiffusion or BoltzGen).\nWhen provided, `targets_id` must contain N*k structures\nand design `i` is aligned against `targets[i*k:(i+1)*k]`.\nMutually exclusive with `protein`; exactly one of the two\nmust be provided.", + }, + targets_id: { + type: "string", + format: "uuid", + description: + "Target ID referencing a **collection** of structures to align against.", + }, + method: { + type: "string", + description: + 'The alignment method to use. Supported values are "kabsch", "nwalign", and "tmalign".', + default: "tmalign", + }, + return_transform: { + type: "boolean", + description: + "Whether to return 3x3 rotation matrices and 3x1 translation vectors.", + default: false, + }, + return_alignment: { + type: "boolean", + description: + "Whether to return aligned query and target sequences as tuples.", + default: false, + }, + return_identities: { + type: "boolean", + description: + "Whether to return sequence identities normalized to alignment length (0-1).", + default: false, + }, + return_plddt: { + type: "boolean", + description: "Whether to return mean pLDDT per target.", + default: false, + }, + }, + }, + example: { + protein: "", + targets_id: "1dfcb748-0f66-4cd0-9fbf-6c5b0da32512", + method: "tmalign", + return_transform: true, + return_alignment: false, + return_identities: true, + return_plddt: true, + }, + }, + }, + }, + responses: { + 200: { + description: + "Stream of structure alignment results.\nEach line is a JSON object representing the result for a single target.", + content: { + "application/x-ndjson": { + schema: { + type: "object", + properties: { + tmscore: { + type: "number", + format: "float", + description: "TM-score for this target structure.", + }, + rmsd: { + type: "number", + format: "float", + description: "RMSD for this target structure.", + }, + identity: { + type: "number", + format: "float", + description: + "Sequence identity for this target, normalized to alignment length (0-1).\nPresent if `return_identities=true`.", + }, + R: { + type: "array", + items: { + type: "array", + items: { + type: "number", + format: "float", + }, + }, + description: + "3x3 rotation matrix for this target (present if `return_transform=true`).", + }, + t: { + type: "array", + items: { + type: "number", + format: "float", + }, + description: + "3x1 translation vector for this target (present if `return_transform=true`).", + }, + alignment: { + type: "array", + items: { + type: "string", + }, + description: + "Tuple of (aligned_query_sequence, aligned_target_sequence).\nFor multichain inputs, chains are joined with `:` in the\norder of the query chain ids.\nPresent if `return_alignment=true`.", + }, + plddt: { + type: "number", + format: "float", + description: + "Mean pLDDT for this target, averaged across all chains\n(NaN residues excluded). Present if `return_plddt=true`.", + }, + design_index: { + type: "integer", + description: + "0-indexed position of the query design within `design_id`.\nPresent only when `design_id` was provided in the request;\nomitted when the request used an uploaded `protein`.", + }, + }, + example: { + tmscore: 0.89, + rmsd: 1.82, + identity: 0.95, + R: [ + [0.998, -0.015, 0.062], + [0.017, 0.999, -0.041], + [-0.061, 0.042, 0.997], + ], + t: [1.23, -0.45, 0.12], + plddt: 87.3, + design_index: 0, + }, + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: "Unauthorized.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + "/api/v1/prompt/plddt_batch_by_id": { + get: { + tags: ["Structure"], + summary: "Get mean pLDDT for all structures in targets_id (Streaming)", + description: + "Retrieve the mean pLDDT scores for all structures contained within the collection\nidentified by `targets_id`.\n\n**Streaming Endpoint:** Returns a stream of JSON objects (NDJSON).", + operationId: "getPlddtBatchById", + parameters: [ + { + name: "targets_id", + in: "query", + description: + "Target ID referencing a **collection** of structures.", + required: true, + schema: { + type: "string", + format: "uuid", + }, + }, + ], + responses: { + 200: { + description: "Stream of pLDDT scores.", + content: { + "application/x-ndjson": { + schema: { + type: "object", + properties: { + plddt: { + type: "number", + format: "float", + description: + "Mean pLDDT for a single target structure, averaged across\nall chains (NaN residues excluded).", + }, + }, + example: { + plddt: 87.3, + }, + }, + }, + }, + }, + 400: { + description: "Invalid input provided.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 401: { + description: "Unauthorized.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + 404: { + description: "Targets ID not found.", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/Error", + }, + }, + }, + }, + }, + security: [ + { + oauth2: [], + }, + ], + }, + }, + }, + components: { + securitySchemes: { + oauth2: { + type: "oauth2", + flows: { + password: { + tokenUrl: "/api/v1/auth/login", + scopes: {}, + }, + }, + }, + }, + schemas: { + PromptMetadata: { + title: "PromptMetadata", + description: + "The metadata of a prompt entity containing sequences and/or structures as context and an optional query used to condition PoET models.", + type: "object", + required: [ + "id", + "name", + "description", + "created_date", + "num_replicates", + "job_id", + "status", + "project_uuid", + ], + properties: { + id: { + type: "string", + format: "uuid", + description: "Prompt unique identifier.", + }, + name: { + type: "string", + description: "Name of the prompt", + example: "My Awesome Prompt", + }, + description: { + type: "string", + description: "Description of the prompt", + example: "Prompt for use with top secret project.", + nullable: true, + }, + created_date: { + type: "string", + format: "date-time", + description: "The date the prompt was created.", + }, + num_replicates: { + type: "integer", + description: "Number of replicates provided as context.", + }, + job_id: { + type: "string", + format: "uuid", + description: "Job ID of any associated job for the prompt.", + nullable: true, + }, + status: { + type: "string", + description: "Status of the prompt.", + }, + project_uuid: { + type: "string", + format: "uuid", + description: "Project this prompt is attached to.", + nullable: true, + }, + sequence_length: { + title: "Sequence Length", + description: + "Length of the prompt's context chains. Set when every chain across\nevery Complex across every replicate has the same length; null when\nchain lengths vary or no context has been parsed yet.", + type: "integer", + nullable: true, + }, + is_system: { + type: "boolean", + default: false, + description: + "True for platform-curated system prompts available to every user.\nSystem prompts are read-only over the HTTP API; users cannot create,\nmodify, or delete them. False or absent for user-uploaded prompts.", + }, + }, + }, + Error: { + title: "Error", + description: "A error object providing details of the error.", + required: ["detail"], + type: "object", + properties: { + detail: { + title: "Detail", + type: "string", + }, + }, + }, + QueryMetadata: { + title: "QueryMetadata", + description: + "The metadata of a query entity containing the sequence and/or structure used as a query to condition PoET2 models.", + type: "object", + required: ["id", "name", "created_date", "project_uuid"], + properties: { + id: { + type: "string", + format: "uuid", + description: "Query unique identifier.", + }, + name: { + type: "string", + description: + "Display name of the query. Defaults to the query's UUID string when the\nuser has not set a name explicitly; clearing the name via PUT (passing\n`null` to `QueryUpdate.name`) resets it to this default.", + example: "My Awesome Query", + }, + created_date: { + type: "string", + format: "date-time", + description: "The date the query was created.", + }, + project_uuid: { + type: "string", + format: "uuid", + description: "Project this query is attached to.", + nullable: true, + }, + sequence_length: { + title: "Sequence Length", + description: + "Length of the query's protein chain(s). Set when every chain in the\nquery has the same length; null when chains differ in length.", + type: "integer", + nullable: true, + }, + }, + }, + QueryUpdate: { + title: "QueryUpdate", + description: + "Fields to update on a query. Omitted fields are left unchanged; fields\nprovided with an explicit null value (for nullable fields) are cleared.", + type: "object", + properties: { + name: { + type: "string", + description: "Name of the query.", + example: "My Awesome Query", + nullable: true, + }, + project_uuid: { + type: "string", + format: "uuid", + description: "Project to attach the query to.", + nullable: true, + }, + }, + }, + PromptUpdate: { + title: "PromptUpdate", + description: + "Fields to update on a prompt. Omitted fields are left unchanged; fields\nprovided with an explicit null value (for nullable fields) are cleared.", + type: "object", + properties: { + name: { + type: "string", + description: "Name of the prompt.", + example: "My Awesome Prompt", + }, + description: { + type: "string", + description: "Description of the prompt.", + example: "Prompt for use with top secret project.", + nullable: true, + }, + project_uuid: { + type: "string", + format: "uuid", + description: "Project to attach the prompt to.", + nullable: true, + }, + }, + }, + EditProteinChainEditConfig: { + title: "EditProteinChainEditConfig", + type: "object", + properties: { + reference_sequence: { + type: "string", + }, + new_sequence: { + type: "string", + }, + structure_mask: { + type: "string", + }, + binding: { + type: "string", + description: + "Optional aligned binding track for the edited chain, in addition to sequence and structure edits. Uses `B` (binding), `N` (not binding), `U` (unknown), and `-` (deleted / no residue).", + }, + plddt: { + type: "number", + minimum: 0, + maximum: 100, + description: + "Optional scalar pLDDT override for the final edited chain. Applied only at residues with known CA coordinates; residues without structure keep NaN.", + }, + }, + }, + EditProteinStructureConfig: { + title: "EditProteinStructureConfig", + type: "object", + properties: { + file_index: { + type: "integer", + description: "Index of the file in the uploaded structures array.", + }, + chain_ids: { + type: "object", + additionalProperties: { + type: "string", + }, + description: "Mapping of original chain IDs to new chain IDs.", + example: { + A: "X", + B: "Y", + }, + }, + edits: { + type: "object", + additionalProperties: { + $ref: "#/components/schemas/EditProteinChainEditConfig", + }, + description: + "Edits to apply to the chains (keyed by the assigned chain ID).", + example: { + X: { + reference_sequence: "ACDEFG", + new_sequence: "ACHEFG", + structure_mask: "SSXSSS", + binding: "UUBUUU", + }, + }, + }, + }, + }, + EditProteinSequenceConfig: { + title: "EditProteinSequenceConfig", + type: "object", + properties: { + sequence: { + type: "string", + }, + chain_id: { + type: "string", + }, + }, + }, + EditProteinGroup: { + title: "EditProteinGroup", + type: "object", + properties: { + structures: { + type: "array", + items: { + $ref: "#/components/schemas/EditProteinStructureConfig", + }, + }, + sequences: { + type: "array", + items: { + $ref: "#/components/schemas/EditProteinSequenceConfig", + }, + }, + }, + }, + EditProteinConfig: { + title: "EditProteinConfig", + description: + "Configuration for editing and combining multiple protein chains.", + type: "object", + properties: { + groups: { + type: "array", + items: { + $ref: "#/components/schemas/EditProteinGroup", + }, + }, + }, + example: { + groups: [ + { + structures: [ + { + file_index: 0, + chain_ids: { + A: "X", + B: "Y", + }, + edits: { + X: { + reference_sequence: "ACDEFG", + new_sequence: "ACHEFG", + structure_mask: "SSXSSS", + binding: "UUBUUU", + plddt: 72.5, + }, + }, + }, + ], + sequences: [ + { + sequence: "MKL", + chain_id: "Z", + }, + ], + }, + ], + }, + }, + }, + }, + tags: [ + { + name: "Prompt", + description: "Prompt _context_ upload, get, and list operations.", + }, + { + name: "Query", + description: "Prompt _query_ upload, get, and list operations.", + }, + { + name: "Structure", + description: "Structure editing and normalization operations.", + }, + { + name: "Align", + description: "Structure and sequence alignment operations.", + }, + ], +}; +export default promptSpec; diff --git a/source/_static/js/swaggerModels.js b/source/_static/js/swaggerModels.js new file mode 100644 index 00000000..1e215cee --- /dev/null +++ b/source/_static/js/swaggerModels.js @@ -0,0 +1,38 @@ +import addSwaggerEndpointsToTOC from "./addSwaggerEndpointsToTOC.js"; +import getSwaggerJson from "./getSwaggerJson.js"; +import getBackendUrl from "./getBackendUrl.js"; + +// Fetch the main-service spec and keep only the /api/v1/models routes. +const swagerSpecs = await getSwaggerJson("models"); + +SwaggerUIBundle({ + spec: swagerSpecs, + dom_id: "#swagger-ui", + deepLinking: true, + tagsSorter: "alpha", + docExpansion: "list", + // Hide the bottom "Schemas" section — we render the models routes as-is and + // don't curate the component list. + defaultModelsExpandDepth: -1, + requestInterceptor: (request) => { + const requestPath = request.url.split("/").slice(3).join("/"); + if (!request.url.includes("openapi.json")) { + const backendUrl = getBackendUrl(); + // Route "Try it out" calls at the live backend. + request.url = backendUrl + requestPath; + } + return request; + }, + responseInterceptor: async (res) => { + if (res.data.type === "application/json5") { + const text = await res.data.text(); + + res.data = text; + res.text = text; + } + + return res; + }, +}); + +addSwaggerEndpointsToTOC(6); diff --git a/source/_static/opmodels/align/image1.png b/source/_static/opmodels/align/image1.png index 9b39c69a..73b24959 100644 Binary files a/source/_static/opmodels/align/image1.png and b/source/_static/opmodels/align/image1.png differ diff --git a/source/_static/opmodels/align/image2.png b/source/_static/opmodels/align/image2.png index 897f9654..c9d03d9c 100644 Binary files a/source/_static/opmodels/align/image2.png and b/source/_static/opmodels/align/image2.png differ diff --git a/source/_static/opmodels/align/image3.png b/source/_static/opmodels/align/image3.png index 34a34899..ea9ff2cf 100644 Binary files a/source/_static/opmodels/align/image3.png and b/source/_static/opmodels/align/image3.png differ diff --git a/source/_static/opmodels/align/image4.png b/source/_static/opmodels/align/image4.png index 0e245753..87f0e58e 100644 Binary files a/source/_static/opmodels/align/image4.png and b/source/_static/opmodels/align/image4.png differ diff --git a/source/_static/opmodels/align/image5.png b/source/_static/opmodels/align/image5.png index c5a549e6..7f47a87e 100644 Binary files a/source/_static/opmodels/align/image5.png and b/source/_static/opmodels/align/image5.png differ diff --git a/source/_static/opmodels/align/image6.png b/source/_static/opmodels/align/image6.png index 61a64fa1..d7e976ef 100644 Binary files a/source/_static/opmodels/align/image6.png and b/source/_static/opmodels/align/image6.png differ diff --git a/source/_static/opmodels/align/image7.png b/source/_static/opmodels/align/image7.png index 07ae821e..5bf1adf4 100644 Binary files a/source/_static/opmodels/align/image7.png and b/source/_static/opmodels/align/image7.png differ diff --git a/source/_static/opmodels/align/image8.png b/source/_static/opmodels/align/image8.png index 3a2500c6..b353f722 100644 Binary files a/source/_static/opmodels/align/image8.png and b/source/_static/opmodels/align/image8.png differ diff --git a/source/_static/opmodels/annotation/annotation-1.png b/source/_static/opmodels/annotation/annotation-1.png new file mode 100644 index 00000000..696971db Binary files /dev/null and b/source/_static/opmodels/annotation/annotation-1.png differ diff --git a/source/_static/opmodels/annotation/annotation-2.png b/source/_static/opmodels/annotation/annotation-2.png new file mode 100644 index 00000000..8e08783e Binary files /dev/null and b/source/_static/opmodels/annotation/annotation-2.png differ diff --git a/source/_static/opmodels/annotation/annotation-3.png b/source/_static/opmodels/annotation/annotation-3.png new file mode 100644 index 00000000..e028c0d1 Binary files /dev/null and b/source/_static/opmodels/annotation/annotation-3.png differ diff --git a/source/_static/opmodels/cluster/cluster-1.png b/source/_static/opmodels/cluster/cluster-1.png new file mode 100644 index 00000000..8aaf9395 Binary files /dev/null and b/source/_static/opmodels/cluster/cluster-1.png differ diff --git a/source/_static/opmodels/cluster/cluster-2.png b/source/_static/opmodels/cluster/cluster-2.png new file mode 100644 index 00000000..d83bbfa5 Binary files /dev/null and b/source/_static/opmodels/cluster/cluster-2.png differ diff --git a/source/_static/opmodels/cluster/cluster-3.png b/source/_static/opmodels/cluster/cluster-3.png new file mode 100644 index 00000000..aa4289eb Binary files /dev/null and b/source/_static/opmodels/cluster/cluster-3.png differ diff --git a/source/_static/opmodels/cluster/cluster-4.png b/source/_static/opmodels/cluster/cluster-4.png new file mode 100644 index 00000000..e67c9e08 Binary files /dev/null and b/source/_static/opmodels/cluster/cluster-4.png differ diff --git a/source/_static/opmodels/cluster/cluster-5.png b/source/_static/opmodels/cluster/cluster-5.png new file mode 100644 index 00000000..37b0e592 Binary files /dev/null and b/source/_static/opmodels/cluster/cluster-5.png differ diff --git a/source/_static/opmodels/cluster/cluster-6.gif b/source/_static/opmodels/cluster/cluster-6.gif new file mode 100644 index 00000000..02215b7c Binary files /dev/null and b/source/_static/opmodels/cluster/cluster-6.gif differ diff --git a/source/_static/opmodels/design/create-design.png b/source/_static/opmodels/design/create-design.png index 3fc54323..ea46ca40 100644 Binary files a/source/_static/opmodels/design/create-design.png and b/source/_static/opmodels/design/create-design.png differ diff --git a/source/_static/opmodels/design/design-constraints-rules.png b/source/_static/opmodels/design/design-constraints-rules.png index b4b2095e..b77b0c92 100644 Binary files a/source/_static/opmodels/design/design-constraints-rules.png and b/source/_static/opmodels/design/design-constraints-rules.png differ diff --git a/source/_static/opmodels/models/calibration.png b/source/_static/opmodels/models/calibration.png index a4218501..85f5dd81 100644 Binary files a/source/_static/opmodels/models/calibration.png and b/source/_static/opmodels/models/calibration.png differ diff --git a/source/_static/opmodels/models/compare-models.png b/source/_static/opmodels/models/compare-models.png deleted file mode 100644 index f593c319..00000000 Binary files a/source/_static/opmodels/models/compare-models.png and /dev/null differ diff --git a/source/_static/opmodels/models/cross-validation.png b/source/_static/opmodels/models/cross-validation.png index 43b8f805..dca443e7 100644 Binary files a/source/_static/opmodels/models/cross-validation.png and b/source/_static/opmodels/models/cross-validation.png differ diff --git a/source/_static/opmodels/models/model-drawer.png b/source/_static/opmodels/models/model-drawer.png deleted file mode 100644 index 416b13d1..00000000 Binary files a/source/_static/opmodels/models/model-drawer.png and /dev/null differ diff --git a/source/_static/opmodels/models/model-drawer2.png b/source/_static/opmodels/models/model-drawer2.png index e057b6f2..c5b980c7 100644 Binary files a/source/_static/opmodels/models/model-drawer2.png and b/source/_static/opmodels/models/model-drawer2.png differ diff --git a/source/_static/opmodels/models/model-drawer3.png b/source/_static/opmodels/models/model-drawer3.png index 49b21824..22b75f18 100644 Binary files a/source/_static/opmodels/models/model-drawer3.png and b/source/_static/opmodels/models/model-drawer3.png differ diff --git a/source/_static/opmodels/models/models-nav.png b/source/_static/opmodels/models/models-nav.png index e86fe485..cc9f56bf 100644 Binary files a/source/_static/opmodels/models/models-nav.png and b/source/_static/opmodels/models/models-nav.png differ diff --git a/source/_static/opmodels/models/models-page.png b/source/_static/opmodels/models/models-page.png index f0570b87..e8e22a50 100644 Binary files a/source/_static/opmodels/models/models-page.png and b/source/_static/opmodels/models/models-page.png differ diff --git a/source/_static/opmodels/models/train-model.png b/source/_static/opmodels/models/train-model.png index 97c7b7e3..59a94701 100644 Binary files a/source/_static/opmodels/models/train-model.png and b/source/_static/opmodels/models/train-model.png differ diff --git a/source/_static/opmodels/models/training-curve.png b/source/_static/opmodels/models/training-curve.png index 25fad848..ef32898c 100644 Binary files a/source/_static/opmodels/models/training-curve.png and b/source/_static/opmodels/models/training-curve.png differ diff --git a/source/_static/opmodels/navigating-your-project/core-leftnav.png b/source/_static/opmodels/navigating-your-project/core-leftnav.png index fc22b053..d39dcd7f 100644 Binary files a/source/_static/opmodels/navigating-your-project/core-leftnav.png and b/source/_static/opmodels/navigating-your-project/core-leftnav.png differ diff --git a/source/_static/opmodels/navigating-your-project/core-mainproject.png b/source/_static/opmodels/navigating-your-project/core-mainproject.png index 5f651ea9..cc87a99c 100644 Binary files a/source/_static/opmodels/navigating-your-project/core-mainproject.png and b/source/_static/opmodels/navigating-your-project/core-mainproject.png differ diff --git a/source/_static/opmodels/navigating-your-project/job-status.png b/source/_static/opmodels/navigating-your-project/job-status.png index bbdb76a8..3dd3c2bf 100644 Binary files a/source/_static/opmodels/navigating-your-project/job-status.png and b/source/_static/opmodels/navigating-your-project/job-status.png differ diff --git a/source/_static/opmodels/overview-projects.png b/source/_static/opmodels/overview-projects.png index 59e5fff9..cffe9343 100644 Binary files a/source/_static/opmodels/overview-projects.png and b/source/_static/opmodels/overview-projects.png differ diff --git a/source/_static/opmodels/ref-sequence/consensus_seq_1.png b/source/_static/opmodels/ref-sequence/consensus_seq_1.png index 8e2970db..944ac560 100644 Binary files a/source/_static/opmodels/ref-sequence/consensus_seq_1.png and b/source/_static/opmodels/ref-sequence/consensus_seq_1.png differ diff --git a/source/_static/opmodels/ref-sequence/consensus_seq_2.png b/source/_static/opmodels/ref-sequence/consensus_seq_2.png index 24f2a13c..5aa4d347 100644 Binary files a/source/_static/opmodels/ref-sequence/consensus_seq_2.png and b/source/_static/opmodels/ref-sequence/consensus_seq_2.png differ diff --git a/source/_static/opmodels/ref-sequence/ref-seq.png b/source/_static/opmodels/ref-sequence/ref-seq.png index c7581c8c..cc7a373d 100644 Binary files a/source/_static/opmodels/ref-sequence/ref-seq.png and b/source/_static/opmodels/ref-sequence/ref-seq.png differ diff --git a/source/_static/opmodels/substitution-analysis/filters.png b/source/_static/opmodels/substitution-analysis/filters.png index 000f906b..8f223053 100644 Binary files a/source/_static/opmodels/substitution-analysis/filters.png and b/source/_static/opmodels/substitution-analysis/filters.png differ diff --git a/source/_static/opmodels/substitution-analysis/image1.png b/source/_static/opmodels/substitution-analysis/image1.png index 573861bd..b883aaea 100644 Binary files a/source/_static/opmodels/substitution-analysis/image1.png and b/source/_static/opmodels/substitution-analysis/image1.png differ diff --git a/source/_static/opmodels/substitution-analysis/image2.png b/source/_static/opmodels/substitution-analysis/image2.png index 14b92553..d8fa82f2 100644 Binary files a/source/_static/opmodels/substitution-analysis/image2.png and b/source/_static/opmodels/substitution-analysis/image2.png differ diff --git a/source/_static/opmodels/substitution-analysis/image3.png b/source/_static/opmodels/substitution-analysis/image3.png index d115b201..20ffec25 100644 Binary files a/source/_static/opmodels/substitution-analysis/image3.png and b/source/_static/opmodels/substitution-analysis/image3.png differ diff --git a/source/_static/opmodels/substitution-analysis/image4.png b/source/_static/opmodels/substitution-analysis/image4.png index 5150a51a..8ed84021 100644 Binary files a/source/_static/opmodels/substitution-analysis/image4.png and b/source/_static/opmodels/substitution-analysis/image4.png differ diff --git a/source/_static/opmodels/substitution-analysis/image6.png b/source/_static/opmodels/substitution-analysis/image6.png index 7362f934..5c1136d0 100644 Binary files a/source/_static/opmodels/substitution-analysis/image6.png and b/source/_static/opmodels/substitution-analysis/image6.png differ diff --git a/source/_static/opmodels/substitution-analysis/image7.png b/source/_static/opmodels/substitution-analysis/image7.png index 8a9d2439..8a560025 100644 Binary files a/source/_static/opmodels/substitution-analysis/image7.png and b/source/_static/opmodels/substitution-analysis/image7.png differ diff --git a/source/_static/opmodels/uploading-your-data/core-new-project.png b/source/_static/opmodels/uploading-your-data/core-new-project.png index beddc50f..7d8faac8 100644 Binary files a/source/_static/opmodels/uploading-your-data/core-new-project.png and b/source/_static/opmodels/uploading-your-data/core-new-project.png differ diff --git a/source/_static/opmodels/uploading-your-data/dataset-settings.png b/source/_static/opmodels/uploading-your-data/dataset-settings.png index fae070e3..fc0c63a4 100644 Binary files a/source/_static/opmodels/uploading-your-data/dataset-settings.png and b/source/_static/opmodels/uploading-your-data/dataset-settings.png differ diff --git a/source/_static/opmodels/uploading-your-data/replicate-header.png b/source/_static/opmodels/uploading-your-data/replicate-header.png index 93251044..e7a71bbe 100644 Binary files a/source/_static/opmodels/uploading-your-data/replicate-header.png and b/source/_static/opmodels/uploading-your-data/replicate-header.png differ diff --git a/source/_static/opmodels/uploading-your-data/replicate-mapping.png b/source/_static/opmodels/uploading-your-data/replicate-mapping.png index 7f7c1ac8..1b6d445f 100644 Binary files a/source/_static/opmodels/uploading-your-data/replicate-mapping.png and b/source/_static/opmodels/uploading-your-data/replicate-mapping.png differ diff --git a/source/_static/opmodels/uploading-your-data/replicate-plot.png b/source/_static/opmodels/uploading-your-data/replicate-plot.png index 91dfe902..099d130b 100644 Binary files a/source/_static/opmodels/uploading-your-data/replicate-plot.png and b/source/_static/opmodels/uploading-your-data/replicate-plot.png differ diff --git a/source/_static/opmodels/uploading-your-data/replicate-tablesettings.png b/source/_static/opmodels/uploading-your-data/replicate-tablesettings.png index 422711d2..b90d5e50 100644 Binary files a/source/_static/opmodels/uploading-your-data/replicate-tablesettings.png and b/source/_static/opmodels/uploading-your-data/replicate-tablesettings.png differ diff --git a/source/_static/opmodels/visualizing-your-data/Design-table-settings.png b/source/_static/opmodels/visualizing-your-data/Design-table-settings.png index 531c434f..89949520 100644 Binary files a/source/_static/opmodels/visualizing-your-data/Design-table-settings.png and b/source/_static/opmodels/visualizing-your-data/Design-table-settings.png differ diff --git a/source/_static/opmodels/visualizing-your-data/design-results-table.png b/source/_static/opmodels/visualizing-your-data/design-results-table.png index f4fd0165..b7f2b54a 100644 Binary files a/source/_static/opmodels/visualizing-your-data/design-results-table.png and b/source/_static/opmodels/visualizing-your-data/design-results-table.png differ diff --git a/source/_static/structure-prediction/AlphaFold2.png b/source/_static/structure-prediction/AlphaFold2.png index 83f83616..431133c5 100644 Binary files a/source/_static/structure-prediction/AlphaFold2.png and b/source/_static/structure-prediction/AlphaFold2.png differ diff --git a/source/_static/structure-prediction/ESMFold.png b/source/_static/structure-prediction/ESMFold.png index 23e8e021..e0d2f16f 100644 Binary files a/source/_static/structure-prediction/ESMFold.png and b/source/_static/structure-prediction/ESMFold.png differ diff --git a/source/_static/structure-prediction/boltz.png b/source/_static/structure-prediction/boltz.png index 1297f0a0..c27d06b9 100644 Binary files a/source/_static/structure-prediction/boltz.png and b/source/_static/structure-prediction/boltz.png differ diff --git a/source/_static/structure-prediction/esmfold2.png b/source/_static/structure-prediction/esmfold2.png index 4a98e698..89e65a73 100644 Binary files a/source/_static/structure-prediction/esmfold2.png and b/source/_static/structure-prediction/esmfold2.png differ diff --git a/source/_static/structure-prediction/minifold.png b/source/_static/structure-prediction/minifold.png index 3aadec9f..bbff3353 100644 Binary files a/source/_static/structure-prediction/minifold.png and b/source/_static/structure-prediction/minifold.png differ diff --git a/source/_static/structure-prediction/protenix.png b/source/_static/structure-prediction/protenix.png index e19d031d..dd4ded16 100644 Binary files a/source/_static/structure-prediction/protenix.png and b/source/_static/structure-prediction/protenix.png differ diff --git a/source/_static/structure-prediction/rosettafold.png b/source/_static/structure-prediction/rosettafold.png index 55d610fe..0e4632fd 100644 Binary files a/source/_static/structure-prediction/rosettafold.png and b/source/_static/structure-prediction/rosettafold.png differ diff --git a/source/_static/structure-prediction/struct-dropdown.png b/source/_static/structure-prediction/struct-dropdown.png index f2e6c3ad..f7fc8d00 100644 Binary files a/source/_static/structure-prediction/struct-dropdown.png and b/source/_static/structure-prediction/struct-dropdown.png differ diff --git a/source/_static/tools/poet/filters-2.png b/source/_static/tools/poet/filters-2.png index 000f906b..69854d86 100644 Binary files a/source/_static/tools/poet/filters-2.png and b/source/_static/tools/poet/filters-2.png differ diff --git a/source/_static/tools/poet/indel-fields.png b/source/_static/tools/poet/indel-fields.png index 782283e8..20c40215 100644 Binary files a/source/_static/tools/poet/indel-fields.png and b/source/_static/tools/poet/indel-fields.png differ diff --git a/source/_static/tools/poet/indel-nav.png b/source/_static/tools/poet/indel-nav.png index a0f5404f..b21baeab 100644 Binary files a/source/_static/tools/poet/indel-nav.png and b/source/_static/tools/poet/indel-nav.png differ diff --git a/source/_static/tools/poet/poet-history-1.png b/source/_static/tools/poet/poet-history-1.png index eeeea1be..121afd07 100644 Binary files a/source/_static/tools/poet/poet-history-1.png and b/source/_static/tools/poet/poet-history-1.png differ diff --git a/source/_static/tools/poet/poet-history-2.png b/source/_static/tools/poet/poet-history-2.png index 2672233f..102ffddc 100644 Binary files a/source/_static/tools/poet/poet-history-2.png and b/source/_static/tools/poet/poet-history-2.png differ diff --git a/source/_static/tools/poet/poet-nav.png b/source/_static/tools/poet/poet-nav.png index 6aa61fed..00750731 100644 Binary files a/source/_static/tools/poet/poet-nav.png and b/source/_static/tools/poet/poet-nav.png differ diff --git a/source/_static/tools/poet/prediction-1.png b/source/_static/tools/poet/prediction-1.png new file mode 100644 index 00000000..f94432aa Binary files /dev/null and b/source/_static/tools/poet/prediction-1.png differ diff --git a/source/_static/tools/poet/prediction-2.png b/source/_static/tools/poet/prediction-2.png new file mode 100644 index 00000000..cd031824 Binary files /dev/null and b/source/_static/tools/poet/prediction-2.png differ diff --git a/source/_static/tools/poet/prediction-3.png b/source/_static/tools/poet/prediction-3.png new file mode 100644 index 00000000..71cb2fc0 Binary files /dev/null and b/source/_static/tools/poet/prediction-3.png differ diff --git a/source/_static/tools/poet/prediction-4.png b/source/_static/tools/poet/prediction-4.png new file mode 100644 index 00000000..16cd3341 Binary files /dev/null and b/source/_static/tools/poet/prediction-4.png differ diff --git a/source/_static/tools/poet/prompt-10.png b/source/_static/tools/poet/prompt-10.png index 0c38103b..a5d40e4f 100644 Binary files a/source/_static/tools/poet/prompt-10.png and b/source/_static/tools/poet/prompt-10.png differ diff --git a/source/_static/tools/poet/prompt-11.png b/source/_static/tools/poet/prompt-11.png index 9d648496..b1d4a047 100644 Binary files a/source/_static/tools/poet/prompt-11.png and b/source/_static/tools/poet/prompt-11.png differ diff --git a/source/_static/tools/poet/prompt-12.png b/source/_static/tools/poet/prompt-12.png index 4e3c46fe..cfaf80c1 100644 Binary files a/source/_static/tools/poet/prompt-12.png and b/source/_static/tools/poet/prompt-12.png differ diff --git a/source/_static/tools/poet/prompt-13.png b/source/_static/tools/poet/prompt-13.png index dae4d0f1..d1ecdb83 100644 Binary files a/source/_static/tools/poet/prompt-13.png and b/source/_static/tools/poet/prompt-13.png differ diff --git a/source/_static/tools/poet/prompt-2.png b/source/_static/tools/poet/prompt-2.png index 1cc29677..c71f614f 100644 Binary files a/source/_static/tools/poet/prompt-2.png and b/source/_static/tools/poet/prompt-2.png differ diff --git a/source/_static/tools/poet/prompt-3.png b/source/_static/tools/poet/prompt-3.png index 4c20be8a..81dc860d 100644 Binary files a/source/_static/tools/poet/prompt-3.png and b/source/_static/tools/poet/prompt-3.png differ diff --git a/source/_static/tools/poet/prompt-4.png b/source/_static/tools/poet/prompt-4.png index e63de809..aac6814d 100644 Binary files a/source/_static/tools/poet/prompt-4.png and b/source/_static/tools/poet/prompt-4.png differ diff --git a/source/_static/tools/poet/prompt-5.png b/source/_static/tools/poet/prompt-5.png index cc9c4b02..9356f98e 100644 Binary files a/source/_static/tools/poet/prompt-5.png and b/source/_static/tools/poet/prompt-5.png differ diff --git a/source/_static/tools/poet/prompt-6-1.png b/source/_static/tools/poet/prompt-6-1.png new file mode 100644 index 00000000..0c02defe Binary files /dev/null and b/source/_static/tools/poet/prompt-6-1.png differ diff --git a/source/_static/tools/poet/prompt-6-2.png b/source/_static/tools/poet/prompt-6-2.png new file mode 100644 index 00000000..747710e9 Binary files /dev/null and b/source/_static/tools/poet/prompt-6-2.png differ diff --git a/source/_static/tools/poet/prompt-6.png b/source/_static/tools/poet/prompt-6.png deleted file mode 100644 index c3676c17..00000000 Binary files a/source/_static/tools/poet/prompt-6.png and /dev/null differ diff --git a/source/_static/tools/poet/prompt-7.png b/source/_static/tools/poet/prompt-7.png index c23b50ae..cd49c692 100644 Binary files a/source/_static/tools/poet/prompt-7.png and b/source/_static/tools/poet/prompt-7.png differ diff --git a/source/_static/tools/poet/prompt-8.png b/source/_static/tools/poet/prompt-8.png index e66b35cd..6d61f939 100644 Binary files a/source/_static/tools/poet/prompt-8.png and b/source/_static/tools/poet/prompt-8.png differ diff --git a/source/_static/tools/poet/prompt-9.png b/source/_static/tools/poet/prompt-9.png index 25a01419..9cebaa4c 100644 Binary files a/source/_static/tools/poet/prompt-9.png and b/source/_static/tools/poet/prompt-9.png differ diff --git a/source/_static/tools/poet/prompt-contenxt-use-existing-1.png b/source/_static/tools/poet/prompt-contenxt-use-existing-1.png deleted file mode 100644 index 26141898..00000000 Binary files a/source/_static/tools/poet/prompt-contenxt-use-existing-1.png and /dev/null differ diff --git a/source/_static/tools/poet/prompt-contenxt-use-existing.png b/source/_static/tools/poet/prompt-contenxt-use-existing.png deleted file mode 100644 index 5d700fcc..00000000 Binary files a/source/_static/tools/poet/prompt-contenxt-use-existing.png and /dev/null differ diff --git a/source/_static/tools/poet/prompt-context-custom-1.png b/source/_static/tools/poet/prompt-context-custom-1.png index 9bcee131..c2ce267f 100644 Binary files a/source/_static/tools/poet/prompt-context-custom-1.png and b/source/_static/tools/poet/prompt-context-custom-1.png differ diff --git a/source/_static/tools/poet/prompt-context-custom-2.png b/source/_static/tools/poet/prompt-context-custom-2.png index f9e38cf1..446498f2 100644 Binary files a/source/_static/tools/poet/prompt-context-custom-2.png and b/source/_static/tools/poet/prompt-context-custom-2.png differ diff --git a/source/_static/tools/poet/prompt-context-msa.png b/source/_static/tools/poet/prompt-context-msa.png index 742b905a..c6ed9525 100644 Binary files a/source/_static/tools/poet/prompt-context-msa.png and b/source/_static/tools/poet/prompt-context-msa.png differ diff --git a/source/_static/tools/poet/prompt-context-use-existing-1.png b/source/_static/tools/poet/prompt-context-use-existing-1.png new file mode 100644 index 00000000..ab40fc30 Binary files /dev/null and b/source/_static/tools/poet/prompt-context-use-existing-1.png differ diff --git a/source/_static/tools/poet/prompt-contenxt-use-existing-2.png b/source/_static/tools/poet/prompt-context-use-existing-2.png similarity index 100% rename from source/_static/tools/poet/prompt-contenxt-use-existing-2.png rename to source/_static/tools/poet/prompt-context-use-existing-2.png diff --git a/source/_static/tools/poet/query-1.png b/source/_static/tools/poet/query-1.png index a2636666..006916b3 100644 Binary files a/source/_static/tools/poet/query-1.png and b/source/_static/tools/poet/query-1.png differ diff --git a/source/_static/tools/poet/query-2.png b/source/_static/tools/poet/query-2.png index 88c7bbfc..a98699e1 100644 Binary files a/source/_static/tools/poet/query-2.png and b/source/_static/tools/poet/query-2.png differ diff --git a/source/_static/tools/poet/refolding settings.png b/source/_static/tools/poet/refolding settings.png deleted file mode 100644 index 9e1ed507..00000000 Binary files a/source/_static/tools/poet/refolding settings.png and /dev/null differ diff --git a/source/_static/tools/poet/refolding-settings.png b/source/_static/tools/poet/refolding-settings.png index 9e1ed507..075a1d8f 100644 Binary files a/source/_static/tools/poet/refolding-settings.png and b/source/_static/tools/poet/refolding-settings.png differ diff --git a/source/_static/tools/poet/results-table-expanded.png b/source/_static/tools/poet/results-table-expanded.png index 4c0c42d9..46733a34 100644 Binary files a/source/_static/tools/poet/results-table-expanded.png and b/source/_static/tools/poet/results-table-expanded.png differ diff --git a/source/_static/tools/poet/results-table-ref-structure.png b/source/_static/tools/poet/results-table-ref-structure.png index e14c8985..116f2a5f 100644 Binary files a/source/_static/tools/poet/results-table-ref-structure.png and b/source/_static/tools/poet/results-table-ref-structure.png differ diff --git a/source/_static/tools/poet/results-table.png b/source/_static/tools/poet/results-table.png index c339df22..16ddbcf0 100644 Binary files a/source/_static/tools/poet/results-table.png and b/source/_static/tools/poet/results-table.png differ diff --git a/source/_static/tools/poet/sampling-parameters.png b/source/_static/tools/poet/sampling-parameters.png index 546d0858..eaaf7482 100644 Binary files a/source/_static/tools/poet/sampling-parameters.png and b/source/_static/tools/poet/sampling-parameters.png differ diff --git a/source/_static/tools/poet/score-sequences-1.png b/source/_static/tools/poet/score-sequences-1.png index d61a4545..581ec9f0 100644 Binary files a/source/_static/tools/poet/score-sequences-1.png and b/source/_static/tools/poet/score-sequences-1.png differ diff --git a/source/_static/tools/poet/sub-analysis-1.png b/source/_static/tools/poet/sub-analysis-1.png index 1b70fe2d..c6620776 100644 Binary files a/source/_static/tools/poet/sub-analysis-1.png and b/source/_static/tools/poet/sub-analysis-1.png differ diff --git a/source/_static/tools/poet/substitution-analysis-input-prompt.png b/source/_static/tools/poet/substitution-analysis-input-prompt.png index 0cc49324..6eecff69 100644 Binary files a/source/_static/tools/poet/substitution-analysis-input-prompt.png and b/source/_static/tools/poet/substitution-analysis-input-prompt.png differ diff --git a/source/_static/tools/poet/system-prompt-1.png b/source/_static/tools/poet/system-prompt-1.png new file mode 100644 index 00000000..01fe7c85 Binary files /dev/null and b/source/_static/tools/poet/system-prompt-1.png differ diff --git a/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-advanced-filters.png b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-advanced-filters.png new file mode 100644 index 00000000..b5fdc876 Binary files /dev/null and b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-advanced-filters.png differ diff --git a/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-antibody-view.png b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-antibody-view.png new file mode 100644 index 00000000..ef7e1402 Binary files /dev/null and b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-antibody-view.png differ diff --git a/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-cluster.png b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-cluster.png new file mode 100644 index 00000000..a0c2893f Binary files /dev/null and b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-cluster.png differ diff --git a/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-dataset-assay-overview.png b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-dataset-assay-overview.png new file mode 100644 index 00000000..d6b46586 Binary files /dev/null and b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-dataset-assay-overview.png differ diff --git a/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-predict.png b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-predict.png new file mode 100644 index 00000000..75037c38 Binary files /dev/null and b/source/_static/walkthroughs/antibody-hit-selection-ngs/ngs-predict.png differ diff --git a/source/python-api/api-reference/embedding.rst b/source/python-api/api-reference/embedding.rst index b07b03a9..9fa8de94 100644 --- a/source/python-api/api-reference/embedding.rst +++ b/source/python-api/api-reference/embedding.rst @@ -29,10 +29,6 @@ Models :inherited-members: :exclude-members: create, get_model -.. autoclass:: openprotein.embeddings.AbLang2Model - :members: - :inherited-members: - .. autoclass:: openprotein.embeddings.OpenProteinModel :members: :inherited-members: @@ -90,7 +86,7 @@ Results :members: :inherited-members: -.. autoclass:: openprotein.embeddings.EmbeddingsScoreSingleSiteFuture +.. autoclass:: openprotein.embeddings.future.EmbeddingsScoreSingleSiteFuture :members: :inherited-members: diff --git a/source/python-api/api-reference/fold.rst b/source/python-api/api-reference/fold.rst index 2908c474..24b9b42b 100644 --- a/source/python-api/api-reference/fold.rst +++ b/source/python-api/api-reference/fold.rst @@ -13,12 +13,15 @@ Interface :undoc-members: -Models +Models ------ .. autoclass:: openprotein.fold.ProtenixModel :members: +.. autoclass:: openprotein.fold.ProtenixV2Model + :members: + .. autoclass:: openprotein.fold.Boltz2Model :members: @@ -49,6 +52,9 @@ Models Results ------- +.. autoclass:: openprotein.fold.ProtenixConfidence + :members: + .. autoclass:: openprotein.fold.ESMFold2Confidence :members: diff --git a/source/python-api/structure-generation/Using_RFdiffusion.ipynb b/source/python-api/structure-generation/Using_RFdiffusion.ipynb index 89d30995..d02beecf 100644 --- a/source/python-api/structure-generation/Using_RFdiffusion.ipynb +++ b/source/python-api/structure-generation/Using_RFdiffusion.ipynb @@ -1163,18 +1163,7 @@ "cell_type": "markdown", "id": "c369740f-b331-4042-b09e-614e98a637e3", "metadata": {}, - "source": [ - "### Inpainting\n", - "\n", - "`inpaint_seq` lets you hide the amino acid identities of specific residues\n", - "in your input structure. RFdiffusion will then fill in these residues during \n", - "design, choosing sequences that fit the new structural context.\n", - "\n", - "For example, if you’re fusing two proteins, residues that were originally\n", - "on the surface (often polar) might end up buried in the core. Instead of\n", - "manually mutating them to hydrophobic residues, you can mask them with\n", - "inpaint_seq so RFdiffusion can decide on the best replacements automatically." - ] + "source": "## Inpainting\n\n`inpaint_seq` lets you hide the amino acid identities of specific residues\nin your input structure. RFdiffusion will then fill in these residues during \ndesign, choosing sequences that fit the new structural context.\n\nFor example, if you’re fusing two proteins, residues that were originally\non the surface (often polar) might end up buried in the core. Instead of\nmanually mutating them to hydrophobic residues, you can mask them with\ninpaint_seq so RFdiffusion can decide on the best replacements automatically." }, { "cell_type": "code", @@ -1770,4 +1759,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/source/rest-api/embeddings.rst b/source/rest-api/embeddings.rst index 8358b5c6..af679e1a 100644 --- a/source/rest-api/embeddings.rst +++ b/source/rest-api/embeddings.rst @@ -24,6 +24,8 @@ Currently, we support the following models: - **ProteinMPNN**: A deep learning model for sequence design conditioned on a fixed protein backbone. It predicts amino acid sequences likely to fold into a given 3D structure by modeling residue–residue interactions through message passing on the protein’s spatial graph. Used for structure-based protein design, stability optimization, and inverse folding tasks. `GitHub link `__, `Reference `__. Licensed under `MIT `__. +- **SolubleMPNN**: A variant of ProteinMPNN trained with weights tuned for soluble protein targets. Uses the same inverse-folding pipeline as ProteinMPNN; `soluble_model` is implied by the route, and `model_name` is restricted to the soluble-compatible weights (`v_48_010`, `v_48_020`). `GitHub link `__, `Reference `__. Licensed under `MIT `__. + - **ESM-IF1**: An inverse-folding model pretrained on PDB and ~12 million AlphaFold-predicted structures. Given a backbone structure, it scores and generates amino acid sequences predicted to fold into it, making it another option for structure-based design and inverse folding alongside ProteinMPNN. `GitHub link `__, `Reference `__. Licensed under `MIT `__. - **AbLang2**: An antibody-specific language model that provides residue-level and sequence-level representations for both heavy and light chains. `GitHub link `__, `Reference `__. Licensed under `BSD-3 `__. diff --git a/source/rest-api/index.rst b/source/rest-api/index.rst index 01a8b260..3b960e40 100644 --- a/source/rest-api/index.rst +++ b/source/rest-api/index.rst @@ -37,9 +37,17 @@ The endpoints include: - Svd +`Models <./models.rst>`_ +------------------------- +A single, unified way to call any model on the platform and to discover what each model can do. List and filter models, fetch a model's metadata (the methods it supports and the parameters they take), and run a method via ``{input}/{output}``. + +The endpoints include: + +- Models + `Align <./align.rst>`_ ---------------------- -Use these endpoints to align multiple sequences. This forms the basis for PoET and certain Fold workflows. +Use these endpoints to align multiple sequences. This forms the basis for PoET and certain Fold workflows. The endpoints include: @@ -92,6 +100,7 @@ To start accessing our suite of APIs, refer to these articles to get started: Authentication and Jobs <./authentication-and-jobs.rst> Assay datasets <./assay-datasets.rst> + Models <./models.rst> Align <./align.rst> Prompt <./prompt.rst> Embeddings <./embeddings.rst> diff --git a/source/rest-api/models.rst b/source/rest-api/models.rst new file mode 100644 index 00000000..e621bf9c --- /dev/null +++ b/source/rest-api/models.rst @@ -0,0 +1,34 @@ +Models +====== + +The Models API is a single, consistent way to call any model on the platform and to discover what each model can do. It unifies foundation models, property predictors, structure predictors, and structure/sequence generators behind one namespace. + +Discovery is driven by model metadata. Each model publishes a metadata document describing the methods it supports, so clients (including our own web app) can build request forms and model cards directly from it — there is no need to hardcode per-model behaviour. + +Core concepts +------------- + +Every method is addressed by two path segments, ``{input}/{output}``: + +- **input** — how inputs are enumerated and the cardinality of the call, e.g. ``batch`` (N sequences → N results; folding is a ``batch`` call too, N complexes → N structures), ``single-site`` (one base sequence → all point mutants), ``indel``, or ``generate`` (sampling). It is an open set. +- **output** — the primary output produced, e.g. ``embeddings``, ``logits``, ``attn``, ``loglikelihood``, ``predictions``, ``structures``, or ``sequences``. Also an open set; models may expose their own. + +A model supports a method only if it declares that ``(input, output)`` pair in its metadata. Each declared method lists its ``outputs`` (name → output type). The request ``params`` a method accepts are fetched separately, per method, from ``.../{input}/{output}/params`` (an inline JSON Schema, enough to render an input form) — this keeps model metadata small even for models with many methods. + +Like the rest of the platform, calls are asynchronous: a ``POST`` returns a job handle, and outputs are fetched from the jobs service once the job completes. + +The endpoints include: + +- **List models** — ``GET /api/v1/models``, with filters (``scope``, ``input``, ``output``, ``output_type``) and a ``verbose`` flag for full metadata. +- **Get model metadata** — ``GET /api/v1/models/{model_id}``, the discovery surface a client renders from. +- **Get model tokens** — ``GET /api/v1/models/{model_id}/tokens``, the input/output token vocabularies (kept out of metadata to keep it small). +- **Get a method's params** — ``GET /api/v1/models/{model_id}/{input}/{output}/params``, the method's request JSON Schema (fetched per method, so metadata stays lean). +- **Run a method** — ``POST /api/v1/models/{model_id}/{input}/{output}``, which returns a job handle. + +Endpoints +--------- + +.. raw:: html + + +
diff --git a/source/walkthroughs/Nanobody_binder_design_with_BoltzGen.ipynb b/source/walkthroughs/Nanobody_binder_design_with_BoltzGen.ipynb index a1119cf6..083fdf28 100644 --- a/source/walkthroughs/Nanobody_binder_design_with_BoltzGen.ipynb +++ b/source/walkthroughs/Nanobody_binder_design_with_BoltzGen.ipynb @@ -1579,31 +1579,7 @@ "cell_type": "markdown", "id": "36285719", "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "In this walkthrough, we've demonstrated how to design nanobody binders for a target of\n", - "interest using BoltzGen and ProteinMPNN. We validated the designs using in-silico metrics and visualized them to ensure\n", - "their viability. The top-ranked designs from this workflow can be:\n", - "\n", - "1. Expressed and purified for experimental validation\n", - "2. Tested for binding affinity\n", - "3. Further optimized through additional rounds of design, for example, with\n", - " [OpenProtein.AI's property regression models](../python-api/property-regression-models/index.rst).\n", - "\n", - "### Other resources\n", - "\n", - "Read more about our binder design workflows and other de novo design tools here:\n", - "- [Designing miniprotein binders with RFdiffusion](./Protein_protein_binder_design_with_RFdiffusion.ipynb)\n", - "- [Inverse folding for protein redesign](./PoET-2_inverse_folding.ipynb)\n", - "- [Antibody lead optimization](./antibody-engineering.ipynb)\n", - "\n", - "or see the detailed API references\n", - "- [BoltzGen](../python-api/api-reference/models.rst#boltzgen)\n", - "- [ProteinMPNN](../python-api/api-reference/models.rst#proteinmpnn)\n", - "- [Boltz-2](../python-api/api-reference/fold.rst#openprotein.fold.Boltz2Model)\n", - "- [PoET-2](../python-api/api-reference/embedding.rst#openprotein.embeddings.PoET2Model)" - ] + "source": "# Conclusion\n\nIn this walkthrough, we've demonstrated how to design nanobody binders for a target of\ninterest using BoltzGen and ProteinMPNN. We validated the designs using in-silico metrics and visualized them to ensure\ntheir viability. The top-ranked designs from this workflow can be:\n\n1. Expressed and purified for experimental validation\n2. Tested for binding affinity\n3. Further optimized through additional rounds of design, for example, with\n [OpenProtein.AI's property regression models](../python-api/property-regression-models/index.rst).\n\n## Other resources\n\nRead more about our binder design workflows and other de novo design tools here:\n- [Designing miniprotein binders with RFdiffusion](./Protein_protein_binder_design_with_RFdiffusion.ipynb)\n- [Inverse folding for protein redesign](./PoET-2_inverse_folding.ipynb)\n- [Antibody lead optimization](./antibody-engineering.ipynb)\n\nor see the detailed API references\n- [BoltzGen](../python-api/api-reference/models.rst#boltzgen)\n- [ProteinMPNN](../python-api/api-reference/models.rst#proteinmpnn)\n- [Boltz-2](../python-api/api-reference/fold.rst#openprotein.fold.Boltz2Model)\n- [PoET-2](../python-api/api-reference/embedding.rst#openprotein.embeddings.PoET2Model)" } ], "metadata": { @@ -1627,4 +1603,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/source/walkthroughs/Protein_protein_binder_design_with_RFdiffusion.ipynb b/source/walkthroughs/Protein_protein_binder_design_with_RFdiffusion.ipynb index daa40371..bba64f01 100644 --- a/source/walkthroughs/Protein_protein_binder_design_with_RFdiffusion.ipynb +++ b/source/walkthroughs/Protein_protein_binder_design_with_RFdiffusion.ipynb @@ -2088,29 +2088,7 @@ "cell_type": "markdown", "id": "12f4bcb3-5512-41cb-92fb-4e44323e1155", "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "In this tutorial, we've demonstrated how to design novel binders for a target of\n", - "interest. We validated the designs using in-silico metrics and visualized them to ensure\n", - "their viability. The top-ranked designs from this workflow can be:\n", - "\n", - "1. Expressed and purified for experimental validation\n", - "2. Tested for binding affinity\n", - "3. Further optimized through additional rounds of design, for example, with\n", - " [OpenProtein.AI's property regression models](../python-api/property-regression-models/index.rst).\n", - "\n", - "### Other resources\n", - "\n", - "Read more about our binder design workflows and other de novo design tools here:\n", - "- [Designing de novo nanobody binders with BoltzGen and ProteinMPNN](./Nanobody_binder_design_with_BoltzGen.ipynb)\n", - "- [Inverse folding for protein redesign](./PoET-2_inverse_folding.ipynb)\n", - "\n", - "or see the detailed API references\n", - "- [RFdiffusion](../python-api/api-reference/models.rst#rfdiffusion)\n", - "- [ProteinMPNN](../python-api/api-reference/models.rst#proteinmpnn)\n", - "- [Boltz-2](../python-api/api-reference/fold.rst#openprotein.fold.Boltz2Model)" - ] + "source": "# Conclusion\n\nIn this tutorial, we've demonstrated how to design novel binders for a target of\ninterest. We validated the designs using in-silico metrics and visualized them to ensure\ntheir viability. The top-ranked designs from this workflow can be:\n\n1. Expressed and purified for experimental validation\n2. Tested for binding affinity\n3. Further optimized through additional rounds of design, for example, with\n [OpenProtein.AI's property regression models](../python-api/property-regression-models/index.rst).\n\n## Other resources\n\nRead more about our binder design workflows and other de novo design tools here:\n- [Designing de novo nanobody binders with BoltzGen and ProteinMPNN](./Nanobody_binder_design_with_BoltzGen.ipynb)\n- [Inverse folding for protein redesign](./PoET-2_inverse_folding.ipynb)\n\nor see the detailed API references\n- [RFdiffusion](../python-api/api-reference/models.rst#rfdiffusion)\n- [ProteinMPNN](../python-api/api-reference/models.rst#proteinmpnn)\n- [Boltz-2](../python-api/api-reference/fold.rst#openprotein.fold.Boltz2Model)" } ], "metadata": { @@ -2134,4 +2112,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/source/walkthroughs/antibody-hit-selection-ngs.rst b/source/walkthroughs/antibody-hit-selection-ngs.rst index 52b410fe..76aac830 100644 --- a/source/walkthroughs/antibody-hit-selection-ngs.rst +++ b/source/walkthroughs/antibody-hit-selection-ngs.rst @@ -7,10 +7,9 @@ This recommended end-to-end workflow guides you through selecting antibody hits from NGS-derived libraries using the **Dataset Assay Details** page. Each step assumes the previous step's output is in place. -This walkthrough is task-oriented. For a detailed feature reference of the controls used below like Predict, Clustering, Advanced Filters, and the Antibody -settings panel, see comprehensive guide at:doc:`/web-app/opmodels/dataset-assay`. +This walkthrough is task-oriented. For a detailed feature reference of the controls used below, view the following pages: `predict withina a table `, 'Clustering `, and the `Antibody settings panel`. -.. figure:: /_static/walkthroughs/antibody-hit-selection-ngs/dataset-assay-overview.png +.. figure:: /_static/walkthroughs/antibody-hit-selection-ngs/ngs-dataset-assay-overview.png :alt: Dataset Assay Details page overview, showing tabs, header chips, and action bar @@ -44,6 +43,9 @@ On the **Dataset** tab, open the **Antibody** panel, then configure the followin You now have a fully annotated table view of the library. +.. figure:: /_static/walkthroughs/antibody-hit-selection-ngs/ngs-antibody-view.png + :alt: open the antibody panel + Reduce redundancy with Clustering ================================= @@ -61,6 +63,8 @@ downstream steps operate on diverse families. You now have a ``Cluster Number`` column. +.. figure:: /_static/walkthroughs/antibody-hit-selection-ngs/ngs-cluster.png + :alt: view cluster column Pre-filter using NGS / antibody metadata ======================================== @@ -86,6 +90,8 @@ Open **Advanced Filters** from the Dataset tab and apply the following filters i Toggle **Show select column** if you want to see what got rejected instead of hiding it. +.. figure:: /_static/walkthroughs/antibody-hit-selection-ngs/ngs-advanced-filters.png + :alt: view cluster column Score with Predict ====================== @@ -103,6 +109,9 @@ With the candidate set narrowed, run a model to rank within it. **Scale with parallel predictions**: You can run multiple predictions in parallel — for example, one for binding and one for developability. Each gets its own chip and its own column. +.. figure:: /_static/walkthroughs/antibody-hit-selection-ngs/ngs-predict.png + :alt: view cluster column + Combine signals ================ diff --git a/source/web-app/opmodels/antibody-annotation.rst b/source/web-app/opmodels/antibody-annotation.rst new file mode 100644 index 00000000..4dbf0e25 --- /dev/null +++ b/source/web-app/opmodels/antibody-annotation.rst @@ -0,0 +1,116 @@ +Antibody annotation +=================== + +This tutorial shows you how the platform automatically annotates antibody sequences on upload: identifying CDR regions, flagging known liabilities, and calling germline V-genes, alleles, and mutation load, all without a separate annotation step. + +Use this as a starting point for screening a dataset for developability risk or germline diversity before moving on to embedding, clustering, or scoring. + +If you run into any challenges or have questions while getting started, please contact `OpenProtein.AI support `_. + + +What you need before starting +------------------------------ + +You need a sequence-only CSV file of antibody sequences. No header row or extra metadata columns are required, the platform detects VH and VL chains on its own and needs no manual chain labeling or numbering. + + +Upload your dataset +^^^^^^^^^^^^^^^^^^^^^ + +Upload your CSV the same way you would a `dataset`. You do not need to upload a csv with properties. If the sequences are recognized as antibodies, the table automatically gains a set of **CDR1** / **CDR2** / **CDR3** / **Liability** chips above the grid, and an **Antibody** entry appears in the table toolbar alongside **Dataset Info**, **Kabat**, **Consensus**, **Settings**, **Collapse**, **Filters**, and **Export**. + +No separate annotation job is needed. Non-antibody protein datasets will not show the Antibody control, since there's no CDR or germline structure to annotate. + + + +Viewing the antibody settings +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Click **Antibody** in the toolbar to open the annotation panel. + +- **Highlight CDRs** lets you toggle **Show CDR1** / **CDR2** / **CDR3** independently. Each region is color-coded directly inside the VH and VL sequence text in the table. +- **Sequence view** offers **Aligned** (pad sequences to a common length for side-by-side comparison) and **Trim non-standard positions**. +- The numbering scheme used to define the CDR boundaries (Kabat, by default) is set from the separate **Kabat** dropdown next to Antibody in the toolbar. + +.. image:: /_static/opmodels/annotation/annotation-1.png + :alt: Antibody panel open showing Highlight CDRs, Sequence view, Liabilities, and Show antibody columns controls + + +Review flagged liabilities +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The **Liabilities** section flags residues or motifs known to affect antibody developability. + +- Choose **Highlight** to mark liabilities directly in the sequence text while still seeing every row. +- Switch to **Filter** to narrow the table down to rows that contain a flagged liability. +- **Show column** adds a dedicated Liability column to the grid, matching the red **Liability** chip shown above the table alongside the CDR chips. + +Use Highlight while you're still exploring the dataset broadly, and switch to Filter once you're ready to narrow in on sequences that need to be deprioritized or redesigned around a specific liability. + + +Choose which antibody columns to show +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Show antibody columns** controls which germline and mutation metrics appear in the grid. It's split into two groups: + +- **Gene**: Germline pair, Heavy V-Gene, and Light V-Gene, each with an **Allele** toggle that switches the calls between gene-level (for example ``IGHV1-69``) and allele-level (for example ``IGHV1-69*01``) precision. +- **Metrics**: Germline pair frequency, Total Mutations, CDR3 length, and Germline distance, numeric summaries computed from each sequence's alignment back to its called germline. + + +Read the annotated table +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Every selected column appears directly in the grid. VH and VL show the full sequence with CDR1, CDR2, and CDR3 shaded in distinct colors inline, followed by the germline and mutation columns you selected: Germline Pair, Germline Pair Frequency, Heavy V-Gene, Light V-Gene, Total Mutations, and more. + +.. image:: /_static/opmodels/annotation/annotation-2.png + :alt: Dataset table with VH and VL columns showing color-coded CDR highlighting, plus Germline Pair, Germline Pair Frequency, Heavy V-Gene, Light V-Gene, and Total Mutations columns + +From here, sort or filter on any of these columns the same way you would elsewhere in the table, and combine them with Embedding, Cluster, or Predictions to bring germline and liability context into hit selection. + + +Column reference +----------------- + +.. list-table:: + :header-rows: 1 + :widths: 20 30 + :align: left + + * - Column + - What it tells you + * - Germline Pair + - The closest matching heavy and light germline gene (or allele, if the Allele toggle is on) called together, for example ``IGHV1-69*01_IGLV1-44*01``. + * - Germline Pair Frequency + - How often this exact germline pairing occurs across the dataset, a quick signal of whether a sequence sits in a common or rare germline background. + * - Heavy V-Gene / Light V-Gene + - The called germline V-gene for each chain individually, with the Allele toggle switching between gene-level and allele-level precision. + * - Total Mutations + - Count of amino acid differences between the sequence and its called germline, a proxy for how far a sequence has diverged through affinity maturation or engineering. + * - CDR3 length + - Length of the CDR3 loop, useful for spotting unusually long or short CDR3s that may affect developability or expression. + * - Germline distance + - Overall sequence distance from the called germline, a broader divergence measure than Total Mutations alone. + * - Liability + - Flags residues or motifs associated with known developability risks (for example deamidation, oxidation, glycosylation sites), shown inline via Highlight or as its own column via Show column. + + +Tips and troubleshooting +-------------------------- + +.. list-table:: + :header-rows: 1 + :widths: 20 20 + :align: left + + * - Question + - Answer + * - Do I need to tell the platform which columns are heavy chain versus light chain? + - No. A sequence-only upload is enough, the platform detects VH and VL chains and numbers them automatically. There's no separate setup step before the Antibody panel becomes available. + * - Why would I turn on Allele instead of leaving germline calls at the gene level? + - Allele-level calls (for example ``IGHV1-69*01``) are more specific and useful when you need to track fine-grained germline differences, such as comparing sequences that share a V-gene but differ by allele. Gene-level calls are easier to scan when you just want a broad family view. + * - My sequences aren't getting annotated as antibodies. + - Confirm the upload is a plain sequence-only CSV or FASTA (no unexpected extra columns before the sequence data) and that the sequences resemble recognizable antibody variable domains. Non-antibody protein datasets won't show the Antibody control since there's no CDR or germline structure to annotate. + * - How does this relate to Embedding, Cluster, and Predictions? + - Antibody annotation is descriptive context computed directly from sequence, it doesn't require an embedding job to run first. You can use it on its own to screen for liabilities and germline diversity, or alongside Embedding, Cluster, and Predictions for a fuller view when selecting hits. + +Please contact `OpenProtein.AI support `_ if the suggested solutions don't resolve the issue. diff --git a/source/web-app/opmodels/cluster-sequences.rst b/source/web-app/opmodels/cluster-sequences.rst new file mode 100644 index 00000000..61402aed --- /dev/null +++ b/source/web-app/opmodels/cluster-sequences.rst @@ -0,0 +1,159 @@ +Cluster sequences +================== + +Overview +-------- + +Clustering groups the sequences in a table by similarity in embedding space, using hierarchical clustering on top of a protein language model embedding (for example, PoET-2). Once a clustering job finishes, every sequence gets a cluster label you can view as a color-coded UMAP, browse as a column in the table, and use to filter or select groups of related sequences. + + +Where this applies +--------------------- + +The Cluster control lives in the same toolbar (alongside Embedding and Predictions) above every sequence table in the product, so the steps below work the same way across **Generate**, **Score**, and **Design**. + + +Before you start +------------------- + +- Have a sequence table open. +- Clustering runs on top of an **embedding**. You will be able to pick an embedding model as part of the setup, so you don't need to precompute one separately. +- How to build the **prompt** for the embedding model, see Embedding Model and Prompt below. + + +1. Open the cluster panel +---------------------------- + +In the toolbar above the table, click the **Cluster** dropdown (it reads ``None`` if nothing is clustered yet). This opens the **Cluster** panel, which lists any existing clustering jobs that had already been run against the table and their settings (embedding, method, linkage, distance metric). + +To start a new one, click **New clustering** in the top-right of the panel. + +.. figure:: /_static/opmodels/cluster/cluster-1.png + :alt: new cluster job + +**Tip:** If a clustering job has already been run on this table, you can just select it from this list instead of creating a new one, jump to Step 4 below. + + +2. Configure the clustering job +----------------------------------- + +**New clustering** opens the **Cluster Sequences** dialog. This clusters every sequence in the table using the embedding model and method you choose here. + +.. figure:: /_static/opmodels/cluster/cluster-2.png + :alt: configuring settings for embedding model + +*The Cluster sequences dialog: pick an embedding model and prompt on top, then a reduction type and hierarchical clustering method below.* + +Embedding model and prompt +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- **Embedding model**: choose which protein language model generates the embeddings sequences are clustered on. The current recommended default is **PoET-2**. +- **Prompt**: PoET family models are conditional, so they need a prompt for context. Reuse an existing saved prompt from the list, or click **+ Create new prompt** to build a new one. See `prompt and prompt sampling methods <./prompts.rst>`_ on how to build a prompt. + +.. figure:: /_static/opmodels/cluster/cluster-3.png + :alt: building a prompt for PoET-2 as the selected embedding model + +**Note:** Models without a conditional prompt requirement (e.g. ESM) will skip the prompt step. If you see the error *"Prompt Query: Please enter a sequence or upload a file..."*, either finish building/selecting a prompt or switch to a model that doesn't require one. + +Reduction type and clustering method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- **Reduction type**: how per-residue embeddings are collapsed into a single vector per sequence (Recommended: ``Mean``). +- **Linkage method**: the hierarchical clustering linkage criterion (Recommended: ``Ward``). +- **Distance metric**: the distance used between embedding vectors (Recommended: ``Euclidean``). Some linkage methods, like Ward, require Euclidean distance and will lock this field automatically. + +.. figure:: /_static/opmodels/cluster/cluster-4.png + :alt: configuring cluster method and reduction types + +When everything is set, click **Run**. + + +3. Run the job and wait for it to finish +-------------------------------------------- + +Clustering runs asynchronously. After you click Run, a job status bar appears above the table, and the **Jobs** counter in the top-right increments. You can keep working, open the Jobs panel any time to check progress, and the new cluster becomes selectable in the Cluster dropdown once it completes. Refresh your browser to view the completed jobs. + + +4. Select the cluster and tune its resolution +------------------------------------------------- + +Open the Cluster dropdown and click a clustering run to select it. Two additional controls appear for hierarchical clusterings: + +- **Number of clusters**: cuts the hierarchical dendrogram to produce exactly this many clusters. +- **Cluster distance**: alternatively, cut the dendrogram at a given distance threshold, adjusting one updates the other. + +.. figure:: /_static/opmodels/cluster/cluster-5.png + :alt: configuring cluster distance and number of clusters + +Both update instantly against the already-computed job, so you can explore coarser or finer groupings without re-running the clustering. Click **Deselect cluster** to go back to ``None``. + +*With a cluster selected, use Number of clusters or Cluster distance to change resolution on the fly.* + + +5. Use the results +---------------------- + +- **UMAP tab**: in the right-hand Dataset panel, set **Discrete** to **Cluster** to color every point by its cluster assignment, using a distinct-colors legend numbered 1, 2, 3, etc. +- **Dataset / results table**: each row shows its assigned cluster once a clustering is selected, so you can sort or filter the table by cluster. +- **Downstream actions**: select a cluster's points on the UMAP (click, or Shift-drag to multi-select) to view them in the table. + +.. figure:: /_static/opmodels/cluster/cluster-6.gif + :alt: selecting sequences in a cluster to view in the table + +*UMAP colored by cluster (Discrete to Cluster), with each of the 10 clusters shown in a distinct color.* + +**Tip:** Switch **Discrete** back to a continuous property at any time to compare cluster structure against an experimental readout side by side. + + +Settings reference +---------------------- + +.. list-table:: + :header-rows: 1 + :widths: 15 12 30 + :align: left + + * - Setting + - Required? + - What it controls + * - Embedding model + - Required + - Which protein language model produces the per-sequence embeddings clustering runs on (PoET-2, ESM variants, AbLang, etc.). + * - Prompt + - Model-dependent + - Context sequences used by conditional models (PoET family). Reuse a saved prompt or build one via Homology Search, MSA upload, Property Based Sample, or direct Upload. + * - Reduction type + - Required + - How per-residue embeddings are pooled into one vector per sequence (e.g. Mean). + * - Linkage method + - Required + - Hierarchical clustering linkage criterion, e.g. Ward, complete, average. + * - Distance metric + - Required + - Distance function between embeddings, e.g. Euclidean. Some linkage methods force this to Euclidean. + * - Number of clusters + - Post-run + - Cuts the dendrogram to a target cluster count. Adjustable after the job completes, no re-run needed. + * - Cluster distance + - Post-run + - Cuts the dendrogram at a distance threshold instead of a fixed count. Linked to Number of clusters. + + +Tips and troubleshooting +---------------------------- + +.. list-table:: + :header-rows: 1 + :widths: 20 20 + :align: left + + * - Question + - Answer + * - The Run button gives a "Prompt Query" error. + - The selected embedding model needs a prompt but none is attached yet. Select an existing prompt from the list, finish building a new one and submit it, or pick a model that doesn't require a prompt. + * - Can I re-cluster with different settings without losing my current one? + - Yes. Click New clustering again to start another run with different embedding/method settings. Every run is saved and listed in the Cluster dropdown, so you can switch between them freely. + * - Do I need to rerun the job to see more or fewer clusters? + - No. Number of clusters and Cluster distance are applied on top of the already-computed dendrogram, so changing them is instant. + * - Does this work the same in Design and Predict results tables? + - Yes. The Cluster control sits in the same toolbar position in Dataset, Design, and Predict result views, and the setup dialog and UMAP coloring behave identically. diff --git a/source/web-app/opmodels/index.rst b/source/web-app/opmodels/index.rst index 14394092..bf73f8ca 100644 --- a/source/web-app/opmodels/index.rst +++ b/source/web-app/opmodels/index.rst @@ -27,6 +27,8 @@ Learn more and get started with our tutorials - `Model training and evaluation <./model-train-evaluate.rst>`_ - `Substitution analysis with OP Models <./sub-analysis.rst>`_ - `Designing sequences <./design.rst>`_ +- `Antibody annotation <./antibody-annotation.rst>`_ +- `Cluster sequences <./cluster-sequences.rst>`_ .. toctree:: :maxdepth: 0 @@ -44,4 +46,5 @@ Learn more and get started with our tutorials Substitution analysis with OP Models Design Aligning sequences - + Automatic Antibody Annotation + Cluster sequences in a table diff --git a/source/web-app/opmodels/uploading-your-data.rst b/source/web-app/opmodels/uploading-your-data.rst index f47f22f9..32aeea35 100644 --- a/source/web-app/opmodels/uploading-your-data.rst +++ b/source/web-app/opmodels/uploading-your-data.rst @@ -55,7 +55,7 @@ Alternatively, you can assign replicates after uploading your CSV file: - Set the **Column type** of each replicate column to ``Property``. - Assign the same **Property name** to columns that represent replicates of the same measurement. - For example, to group ``Luminosity (Rep 1)`` and ``Luminosity (Rep 2)``, assign both the property name ``Replicate Luminosity``. + For example, to group ``mutation_effect_prediction_vae_1`` and ``mutation_effect_prediction_vae_2``, assign both the property name ``mutation_effect_prediction_vae``. .. image:: /_static/opmodels/uploading-your-data/replicate-mapping.png diff --git a/source/web-app/poet/prompts.rst b/source/web-app/poet/prompts.rst index d44d667a..24dc3f19 100644 --- a/source/web-app/poet/prompts.rst +++ b/source/web-app/poet/prompts.rst @@ -82,10 +82,12 @@ You can create a prompt context in three ways: If you've previously uploaded prompts, you can reuse them. In the **Choose from project**, select an existing prompt. The sequences from that prompt will automatically load. -.. image:: /_static/tools/poet/prompt-contenxt-use-existing-1.png +This list also includes any **System** prompts available to you, see System Prompts below for the full catalog. + +.. image:: /_static/tools/poet/prompt-context-use-existing-1.png :alt: Use existing prompt -.. image:: /_static/tools/poet/prompt-contenxt-use-existing-2.png +.. image:: /_static/tools/poet/prompt-context-use-existing-2.png :alt: Use existing prompt 2. Create Custom Context @@ -182,7 +184,10 @@ Without a Project ^^^^^^^^^^^^^^^^^^^ Navigate to any PoET tool under **Prompt Definition**. You can either input the MSA directly or upload an existing `.fa`, `.fasta`, or `.csv` file. -.. image:: /_static/tools/poet/prompt-6.png +.. image:: /_static/tools/poet/prompt-6-1.png + :alt: Uploading MSA without a project + +.. image:: /_static/tools/poet/prompt-6-2.png :alt: Uploading MSA without a project Within a Project @@ -272,3 +277,53 @@ The **homology level** field allows you to generate more or less diverse prompt - If you need more focused generation, use a higher homology level and set a minimum similarity threshold to ensure the prompt focuses on the local sequence landscape around your seed. The default **maximum** and **minimum similarity parameters** are set to values which perform well across a wide range of protein families. These can be tuned to adjust the diversity of sequences that will be modeled by PoET. + +Antibody Prompts +----------------- + +In addition to prompts you build yourself, OpenProtein.AI provides **system prompts**: platform-curated prompts available out-of-the-box. + +Antibody prompts appear in the same prompt list used across the PoET tools (Score Sequences, Create Embedding, Cluster, Predictions, and Train a Model), marked with a **System** badge. Prompts recommended for your current model and property selections are additionally marked **Recommended**, and prompts built for a specific chain configuration carry a short tag, for example ``Antibody_vh_vl``. A prompt name ending in **(Virtual)** indicates a pre-computed model memory rather than a sampled context, see below. + +**Note:** Antibody prompts can't be edited or deleted the way a prompt of your own can. If you need a variation, for example a different sample size or clustering threshold, build a new prompt following the same reference database as a starting point, see Creating a Context below. + +.. image:: /_static/tools/poet/system-prompt-1.png + :alt: system level prompts + +Virtual vs. Sampled Prompts +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Most antibody prompts are built the same way a user-defined prompt is: as an ensemble of replicates sampled from a reference database. For the antibody prompts below, each replicate is a random sample of 200 naive sequences from the OAS paired antibody database, clustered at 70% sequence identity, with 10 replicates per ensemble. + +A prompt labeled **(Virtual)** works differently. It's a pre-computed PoET-2 memory, trained ahead of time using cluster representatives from the reference database (via mmseqs2 linclust) with a frozen PoET-2 backbone and a fixed number of virtual sequences, using the ``poet-2-vcontext`` prompt type. Because the context is pre-computed rather than sampled per job, it has a single replicate and only supports PoET-2. + +Available Prompts +~~~~~~~~~~~~~~~~~~~~ + +Antibody Human VH-VL (Virtual) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pre-computed PoET-2 memory trained using mmseqs2 linclust cluster reps from OAS human paired antibody sequences clustered at 70% sequence identity. Trained with a frozen PoET-2 backbone and ``nvs=40`` virtual sequences using ``poet-2-vcontext``. + +Antibody Human VH-VL +^^^^^^^^^^^^^^^^^^^^^ + +An ensemble of 10 replicates, each a random sample of 200 naive paired human antibody sequences from the OAS paired database, clustered at 70% sequence identity. Each complex is the heavy chain (VH) followed by the light chain (VL). + + +Antibody Human VL-VH +^^^^^^^^^^^^^^^^^^^^^ + +An ensemble of 10 replicates, each a random sample of 200 naive paired human antibody sequences from the OAS paired database, clustered at 70% sequence identity. Each complex is the light chain (VL) followed by the heavy chain (VH). + +Antibody Human VH +^^^^^^^^^^^^^^^^^^ + +An ensemble of 10 replicates, each a random sample of 200 naive human antibody heavy chain (VH) sequences from the OAS paired database, clustered at 70% sequence identity. + + +Antibody Human VL +^^^^^^^^^^^^^^^^^^ + +An ensemble of 10 replicates, each a random sample of 200 naive human antibody light chain (VL) sequences from the OAS paired database, clustered at 70% sequence identity. + diff --git a/source/web-app/poet/score-sequences.rst b/source/web-app/poet/score-sequences.rst index 10c76c9c..00dec15b 100644 --- a/source/web-app/poet/score-sequences.rst +++ b/source/web-app/poet/score-sequences.rst @@ -94,6 +94,74 @@ Improve your results by adding more sequences with your desired properties to yo To improve scores, increase the number of the **ensemble** setting. This will result in higher scoring sequences, but will take longer to complete. +Running predictions within a dataset +------------------------------------ + +If the sequences you want to score already live in a dataset, design results, or predict results table, you can score them in place using the **Predictions** panel instead, without leaving the table. + +Predictions supports two kinds of models: + +- A **user model** you've already trained on your own assay data, so its held-out accuracy is known before you trust its ranking. +- A **foundation model**, such as PoET-2, for zero-shot scoring when you don't yet have labeled data for the property you care about. + +Step 1: Create prediction +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the toolbar above the table, click the **Predictions** dropdown (it shows **None** if the table hasn't been scored yet). This lists any prediction jobs already run against the table. Click **New prediction** to open the **Create Prediction** dialog. + +.. image:: /_static/tools/poet/prediction-1.png + :alt: open new prediction window + +Step 2: Choose a model +^^^^^^^^^^^^^^^^^^^^^^^ + +Create prediction offers two tabs: + +- **User models** lists trained models available in your project, along with the property each one predicts, what dataset it was trained on, and its held-out Spearman's rho and Pearson's r against measured values. Select one or more models and click **Run** to score the whole table. + +.. image:: /_static/tools/poet/prediction-2.png + :alt: choosing models + +- **Foundation models** lets you score without a trained model of your own. Models are grouped by family, with **PoET-2** recommended. PoET-family models are conditional and require a **prompt**, the same prompt mechanism used by Score Sequences (see `prompts and prompt sampling methods <./prompts.rst>`_). Reuse a saved prompt or build a new one before running. + +.. image:: /_static/tools/poet/prediction-3.png + :alt: choosing plm + +Step 3: Run the scoring job +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scoring runs as a background job. After clicking Run, a job status bar appears above the table and the **Jobs** counter increments. The Predictions dropdown shows the run as in progress until it finishes, at which point its predicted column becomes available in the table. + +Step 4: Read the predicted column and select hits +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Once a run finishes, select it from the Predictions dropdown. Each selected run adds its own column to the table, named after the source model, sitting right alongside any measured column it was trained to predict. + +.. image:: /_static/tools/poet/prediction-4.png + :alt: reviewing predict results + + +With a predicted column in the table, hit selection is a matter of working the table: + +.. list-table:: + :header-rows: 1 + :widths: 20 20 + :align: left + + * - Action + - Why it helps + * - Sort by the predicted column + - Brings your top-scoring candidates to the top. + * - Filter above a score threshold + - Cuts the table down to only the rows worth reviewing. + * - Cross-check against cluster assignment, if available + - Keeps your shortlist diverse instead of pulling near-duplicates from one region of sequence space. + * - Select more than one completed run + - Lets you compare predictions across multiple properties at once, for example activity and stability. + +Once you've selected your rows, carry the shortlist forward into Create Design, Substitution Analysis, or Train Model. + + Next Steps ---------- diff --git a/source/web-app/poet/substitution-analysis.rst b/source/web-app/poet/substitution-analysis.rst index 0c87d0c3..eb06e285 100644 --- a/source/web-app/poet/substitution-analysis.rst +++ b/source/web-app/poet/substitution-analysis.rst @@ -93,7 +93,7 @@ Your highest scoring variants and sites are also displayed in tables below the h .. image:: /_static/tools/poet/sub-analysis-1.png :alt: Substitution Analysis Heatmap -Refer to the **Details** tab to see the parameters you used to run the Substitution Analysis. +Refer to the **Input** tab to see the parameters you used to run the Substitution Analysis. Fine-tuning your results ------------------------