| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: bundle portable AF2-Multimer and repair OpenMM termini | 26 天前 | |
feat: initialize protein-design-mcp project structure Add comprehensive project setup for MCP server enabling LLM agents to run protein binder design pipelines using RFdiffusion, ProteinMPNN, and ESMFold. Files added: - PRD.md: Full product requirements document - CLAUDE.md: Development guidelines for Claude Code - environment.yml: Conda environment configuration - pyproject.toml: Python package configuration - README.md: Project documentation Project structure: - src/protein_design_mcp/: Main package - server.py: MCP server entry point with 6 high-level tools - tools/: Tool implementations (design_binder, analyze, validate, etc.) - pipelines/: Wrappers for RFdiffusion, ProteinMPNN, ESMFold - utils/: PDB parsing, metrics, caching utilities - resources/: MCP resource handlers - tests/: Test suite skeleton | 9 个月前 | |
fix: manifest loader no longer excludes every tool on one bad file load_manifests_resilient excludes a failing manifest individually (with a model-facing reason) instead of aborting the whole directory load; two manifests claiming one name exclude both, a bad cross-reference or missing sibling-doc heading excludes only the offending manifest. STRICT_MANIFESTS=1 restores today's all-or-nothing behavior for CI. build_registry now uses this path; ToolRegistry.resolve() surfaces the specific reason instead of "unknown tool" for a name that failed to load. | 1 个月前 | |
fix: bundle portable AF2-Multimer and repair OpenMM termini | 26 天前 | |
feat: add run_alphafold3 via sibling Docker container (structure_prediction) AF3 runs from its own Docker image, never a process in a mounted conda environment -- this tool's wrapper shells out to docker run directly, launching a SIBLING container next to this server's own. engine.env is "scoring" (the plain baked-in CPU env already shared by run_prodigy/ run_ipsae) purely to get a Python interpreter to build JSON and shell out; no conda-mounted engine is involved. States two deployment requirements explicitly in the doc, neither arrangeable from a manifest: (1) this server's own container needs the docker CLI on PATH and the host's Docker socket bind-mounted in -- CONFIRMED this is not yet true of the current protein-design-mcp:full image; (2) the dispatcher's scratch workdir must be valid at an identical path on the Docker daemon's own host (mirrors design 2.2's "mount environments at their own host path" rule, applied to the scratch dir). Verified the sibling-container MECHANISM live (this host runs docker directly, not nested): GPU pinning (--gpus device=7 exposes exactly one L40S inside the sibling container) and all three bind mounts confirmed against a present image. The ground-truth image tag (alphafold3-mmseqs:latest, from the reference invocation script) is not present on this host -- only a differently-laid-out image is -- so no full fold was completed; this gap is stated plainly, not silently substituted. MSA coupling: unpaired_msa/paired_msa are both-null (-> AlphaFold 3's own ""/"" MSA-free encoding) or both-a-path (-> both files' content embedded inline) -- never null/null, which is AlphaFold 3's OWN encoding for "build both MSAs yourself", exactly what disabling its data-pipeline flag exists to prevent. Scope: protein chains only in this version -- no RNA, DNA, ligands, covalent bonds, or templates; a stated, deliberate boundary given this wave's time budget. CONFIRMED LIVE through the real ServerApp.call_tool dispatch: correctly registered and reaches the docker-launch step; direct-on-host execution (outside a container, where "scoring" is not a real conda env) fails for that expected, documented reason. | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
Validate BoltzGen analysis identities before dispatch | 24 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
Support external designed backbones in BoltzGen folding and recover invalid input paths | 24 天前 | |
fix: build BoltzGen inverse-fold specs inside the tool | 26 天前 | |
fix: point Chai at its bundled model assets and validate their presence | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
test: assert adapter-discovery invariants instead of a module snapshot | 1 个月前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
feat: add run_esm_score (ESM2-650M pseudo-log-likelihood, scoring) Masked-marginal pseudo-log-likelihood over a protein sequence, env esm_env (fair-esm, torch 2.4.0+cu121) as specified. Uses the field-standard masked-marginal definition (one masked forward pass per position, batched), not the cheaper wildtype-marginal approximation this repo's old pipelines/esm2_scorer.py used. Documented plainly as a developability proxy, not a binding predictor, per the brief. TORCH_HOME is pointed at the host's existing torch-hub cache (already holding esm2_t33_650M_UR50D.pt) so it is reused instead of re-downloaded every call, mirroring run_esmfold2.yaml's HF_HOME fix. CONFIRMED LIVE end to end through the real ServerApp.call_tool dispatch, GPU 7: a 330-residue sequence returned pseudo_log_likelihood: -1.0448. Checked run_proteina_complexa_analyze for the brief's claim that it names this tool as a producer of some of its optional inputs -- it currently does not (those inputs are attributed to run_mpnn/run_esmfold2 instead), so no field-name alignment was needed. | 1 个月前 | |
feat: add run_esmfold2 (structure_prediction) ESMFold2 via esm==3.4.0's EvolutionaryScale SDK, host-mounted GPU env. Guards against the PYTHONNOUSERSITE fair-esm 2.0.0 shadowing trap at runtime; no msa parameter (the model takes none). Verified live on GPU 7 through ServerApp.call_tool. | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: add run_genie2 (monomer_generation) Wraps Genie 2's unconditional SE(3)-diffusion sampler. Verified live on GPU 7 through ServerApp.call_tool. | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: add run_interface_residues, run_epitope_scan (target_analysis) Closes the hotspot gap: run_rfdiffusion_binder, run_genie3_binder, run_protpardelle and run_rfdiffusion3_binder all require hotspots and nothing produced them. Both new tools expose this server's own already-tested geometry code (utils.pdb.get_interface_residues, utils.sasa.calculate_sasa, and utils.conservation's per-column scoring primitive) rather than new science. run_interface_residues measures per-residue contacts and buried SASA from an existing complex. run_epitope_scan predicts candidate epitope residues on an unbound target, ranked by exposure alone -- conservation is exposed as separate per-residue evidence, never folded into one score (the suggest_hotspots mistake this replaces). No network access: msa is a caller-supplied a3m (run_mmseqs_search's own contract), never fetched. Both emit hotspot_tags ("{chain}{resnum}" strings) that plug into all four consumers unmodified (three take the list as-is, run_rfdiffusion3_binder joins it with commas) -- confirmed live end to end: run_interface_residues against the real 1BRS barnase/barstar interface produced hotspot_tags including the literature-known A59/A83/A27 contacts, fed directly into run_genie3_binder, which generated a real 20-residue binder. Added scripts/live_proof.py CASES entries for both tools (established precedent: prior waves extend this shared file's table when they add a tool it doesn't yet cover). | 1 个月前 | |
fix: export RF3 full confidence matrices for interface scoring | 25 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: add run_mmseqs_search, the first MSA tool Builds an AlphaFold-3-shaped alignment (unpaired a3m, paired a3m, templates a3m) via the standalone mmseqs binary against the local 1.3TB databases, following ~/projects/af3-mmseqs-gpu's own working MMseqs2-GPU fork as the reference implementation. This is the gating tool for the nine planned structure-prediction tools: none of them may build its own alignment, so until this lands there was nowhere for a caller to get one. Every knob MMseqs2 exposes that changes the search (sensitivity, e-value, coverage, identity, iterations, max hits, which databases) is a schema parameter with a documented default, per the binding parameter policy. Dispatches via env (not prefix): the wrapper needs no Python package beyond stdlib, only the mmseqs binary and the database root, declared via engine.mounts. Confirmed live that these particular databases are GPU-padded and CPU-mode search against them is impractical (a small_bfd search was still running after 2+ minutes / 80GB+ RES vs 43s on GPU), so requires.gpu: true. Also updates meta_tools.py's describe_tool category enum and several test fixtures for the nine-category taxonomy rename that landed concurrently on this branch (generation -> binder_generation, cofolding -> structure_prediction, plus run_analysis/preparation), and widens test_adapter_discovery's shipped-module-count assertion from four to five now that mmseqs_search.py is real. | 1 个月前 | |
feat: four-environment image with live proof for every tool | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
Reject incomplete OpenMM structures as recoverable input errors | 23 天前 | |
fix: key ADAPTERS on tool name, not colliding engine repo manifest.engine.repo is not unique: several tools sharing one engine (e.g. planned run_boltzgen_design/_inverse_fold/_filter) would resolve to the same adapter functions and get argv built for the wrong tool. Key ADAPTERS on manifest.name and pass the manifest into build_args and parse_output so one adapter module can still branch per tool. Also widen call_tool's except to Exception so an adapter KeyError (the likely mistake when validate_and_fill omits an optional parameter with no default) returns a clear "adapter for <tool> failed" error instead of an opaque one. | 1 个月前 | |
feat: add run_promera (structure_prediction) Promera co-folding, host-mounted GPU env (editable install, scratchpad checkout -- durability caveat documented in the manifest). msa is a per-chain map keyed to exactly the chains given; the wrapper stages caller-supplied a3m files into tinyprot's sequence-hash-keyed MSA cache directory. Verified live on GPU 7 through ServerApp.call_tool, both MSA-free and with a supplied alignment. | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
fix: require a protpardelle chain break to have a segment on both sides | 30 天前 | |
feat: add run_rebuild_backbone so a CA-trace generator can reach run_mpnn | 1 个月前 | |
fix: export RF3 full confidence matrices for interface scoring | 25 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
fix: validate Rosetta partner chains and bound MPNN CPU workers | 26 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
Support external designed backbones in BoltzGen folding and recover invalid input paths | 24 天前 | |
Provide real native design specifications in folding regression fixtures | 24 天前 | |
Provide real native design specifications in folding regression fixtures | 24 天前 | |
fix: build BoltzGen inverse-fold specs inside the tool | 26 天前 | |
feat: add run_mmseqs_search, the first MSA tool Builds an AlphaFold-3-shaped alignment (unpaired a3m, paired a3m, templates a3m) via the standalone mmseqs binary against the local 1.3TB databases, following ~/projects/af3-mmseqs-gpu's own working MMseqs2-GPU fork as the reference implementation. This is the gating tool for the nine planned structure-prediction tools: none of them may build its own alignment, so until this lands there was nowhere for a caller to get one. Every knob MMseqs2 exposes that changes the search (sensitivity, e-value, coverage, identity, iterations, max hits, which databases) is a schema parameter with a documented default, per the binding parameter policy. Dispatches via env (not prefix): the wrapper needs no Python package beyond stdlib, only the mmseqs binary and the database root, declared via engine.mounts. Confirmed live that these particular databases are GPU-padded and CPU-mode search against them is impractical (a small_bfd search was still running after 2+ minutes / 80GB+ RES vs 43s on GPU), so requires.gpu: true. Also updates meta_tools.py's describe_tool category enum and several test fixtures for the nine-category taxonomy rename that landed concurrently on this branch (generation -> binder_generation, cofolding -> structure_prediction, plus run_analysis/preparation), and widens test_adapter_discovery's shipped-module-count assertion from four to five now that mmseqs_search.py is real. | 1 个月前 | |
test: verify tool-to-tool handoffs, not just that each tool runs live_proof.py checks each tool alone: it runs, and returns the keys its manifest promises. Every defect found this week passed that check. chain_proof.py makes the handoff instead -- real MCP calls through the same ServerApp.call_tool path a client uses, asserting about what the consumer did with the producer's output. Two chains today, both passing: mpnn_preserves_target a generator's two-chain complex through run_mpnn: the 504-residue target must come back byte-identical and only the 80-residue design may change. Before chains_to_design this returned one 585-residue sequence that was neither. genie3_unk_handoff_is_honest run_genie3_binder's UNK/CA-only design through run_mpnn. ProDy does not see that chain as protein; the handoff must fail loudly rather than return the target's own sequence as a design. It errors, which is the honest outcome. Chains start from fixtures produced by earlier live runs: re-running a 15-minute generator to obtain a file that already exists spends GPU on the part not under test. A missing fixture skips its chain rather than failing it. | 1 个月前 | |
feat: enhance suggest_hotspots with UniProt, conservation, SASA, and PubMed integration | 9 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: add run_mmseqs_search, the first MSA tool Builds an AlphaFold-3-shaped alignment (unpaired a3m, paired a3m, templates a3m) via the standalone mmseqs binary against the local 1.3TB databases, following ~/projects/af3-mmseqs-gpu's own working MMseqs2-GPU fork as the reference implementation. This is the gating tool for the nine planned structure-prediction tools: none of them may build its own alignment, so until this lands there was nowhere for a caller to get one. Every knob MMseqs2 exposes that changes the search (sensitivity, e-value, coverage, identity, iterations, max hits, which databases) is a schema parameter with a documented default, per the binding parameter policy. Dispatches via env (not prefix): the wrapper needs no Python package beyond stdlib, only the mmseqs binary and the database root, declared via engine.mounts. Confirmed live that these particular databases are GPU-padded and CPU-mode search against them is impractical (a small_bfd search was still running after 2+ minutes / 80GB+ RES vs 43s on GPU), so requires.gpu: true. Also updates meta_tools.py's describe_tool category enum and several test fixtures for the nine-category taxonomy rename that landed concurrently on this branch (generation -> binder_generation, cofolding -> structure_prediction, plus run_analysis/preparation), and widens test_adapter_discovery's shipped-module-count assertion from four to five now that mmseqs_search.py is real. | 1 个月前 | |
fix: derive describe_tool's category enum from the registry (v2.0.1) target_analysis was in CATEGORIES but not in describe_tool's hand-copied enum, so run_interface_residues and run_epitope_scan were registered and listed while the documented way to discover them denied the category existed. Both the enum and the summary now come from CATEGORIES. Found by driving the real server from the proteinmem-mcp harness. | 1 个月前 | |
fix: preserve run.outputs on parse failure, fix describe_tool isError G2: when an adapter's parse_output raised, run.outputs (paths the dispatcher already collected) was discarded along with the exception, making completed hour-long GPU jobs' files unreachable over a regex mismatch. call_tool now catches parse_output failures directly and returns the collected outputs alongside the parse-failure message. M1: describe_tool signals failure by returning a dict with an "error" key rather than raising, but call_tool always wrapped it via _ok(), so every describe_tool failure mode (unknown tool, empty category, bad parameter) reported isError=False. Added _error_payload() so any already-assembled error dict routes through the same isError=True path as every other refusal. | 1 个月前 | |
fix: detect GPU from device nodes, drop -t so stdio works DEVICE=auto reported cpu inside a GPU-pinned container because the server env has no torch by design, excluding 27 of 39 tools. Detect a numbered /dev/nvidia node instead. Also emit -i not -it: docker refuses piped stdin on a TTY container, which broke the command's whole purpose. Verified live: 41 tools over a real MCP handshake against the built image. | 1 个月前 | |
fix: audit every manifest's prose against the surface it describes The documentation defects found so far were each caught by a run, and each belonged to a class the whole surface could have been checked for at once. So scripts/doc_audit.py checks all five, and the suite fails on any of them: names a run_* name in prose that is not a tool parameters a backticked parameter this tool does not have host-paths a machine-specific path in text a model reads provenance a required path with no stated source descriptions a parameter or output with no usable description What it found and this fixes: - Three host paths in model-facing prose -- /home/jk661/.local/bin/foldseek, /home/jk661/.cache/colabfold_dbs, /file_server/data/jk661/... A model copies one into an argument and names a file that exists on one machine. engine.mounts keeps the real paths, because the dispatcher needs them; the DESCRIPTIONS now say what the path is instead of where it happens to be. - Thirteen required paths that named no producing tool and did not say the caller brings one. Each now says where a caller gets it: run_ipsae.structure comes from the same predictor run as the PAE, run_alphafold2_multimer.msa from run_mmseqs_search or run_colabfold_search, a binder tool's target_pdb from the caller. That is the class design_spec belonged to, where the absence cost a planned round four steps in. - Three parameters described in two or three words -- two "Random seed." and one "Minimisation step limit." -- out of roughly 400. Rewritten to say what changes when the value moves, which is the standard the rest already meet. Each check earned its shape by reporting something false first: run_alphafold.py is AlphaFold 3's own script and not a missing tool, run_boltzgen_ is a family glob the name pattern truncates, msa and length are ordinary words that happen to be parameters elsewhere, and "your own structure file" is how a caller-supplied target is honestly phrased. The overclaim check stays advisory: "every predicted structure" is ordinary English, and only a reader can say whether an absolute claim is true of all of them. | 1 个月前 | |
config: add pytest pythonpath, drop manual sys.path hacks python -m pytest with no PYTHONPATH set resolved protein_design_mcp to a different checkout via an ambient editable install, so results depended on which shell ran the tests. Add [tool.pytest.ini_options] pythonpath = ["src", "scripts"], which makes this checkout resolve deterministically, and delete the now-redundant sys.path.insert lines in tests/test_doc_generation.py and scripts/generate_tool_docs.py. | 1 个月前 | |
Stabilize OpenMM minimization and pin a compatible CUDA runtime | 25 天前 | |
Fix long-path multiprocessing IPC and effective inverse-fold worker configuration | 24 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
fix: document chain conventions, expose co-generated sequences, let mpnn pick a chain Found by reading five generators' real outputs for the same target, not by reading source: run_genie3_binder design = chain A UNK, CA-only run_rfdiffusion2 design = chain B poly-alanine run_rfdiffusion3_binder design = chain A real sequence, 18 residue types run_protpardelle design = chain B poly-glycine run_proteina_complexa design = chain B real sequence, all-atom A, B, A, B, B -- and only run_genie3_binder said so anywhere a caller reads. An assumption carried from one generator to the next is wrong half the time, which is the same class of mistake that made v1's design_binder return the target as its own design. Every generator now states its chain convention and whether the design carries a real sequence or a placeholder. run_rfdiffusion3_binder co-generates a sequence and buried it in a gzipped CIF the result never mentioned; parse_output now returns {chain: sequence} per structure. The CIF parser reads column positions from the _atom_site header -- a fixed-index parse of that same file silently produced 504 one-residue 'chains'. run_mpnn had no way to say which chain to design, so it redesigned every chain in the file: a 504-residue target plus an 80-residue binder came back as one 585-residue sequence that is neither, and the harness's target-copy guard cannot catch a *redesigned* target. Added chains_to_design, fixed_residues and redesigned_residues, which LigandMPNN already supported. Verified live: with chains_to_design='B' the 504-residue target comes back byte-identical and only the 80-residue binder is redesigned. | 1 个月前 | |
fix: genie3's side-chain stage is unreachable from the scaffold tool too Corrects the previous commit, which kept predict_sidechain on run_genie3_scaffold on the reasoning that it IS the unconditional path. That reasoning was wrong and running it settled it: workflow.py:204: assert config.inference.sampler.sampler.predict_sequence AssertionError The guard is three assertions, not one. The third needs Genie 3's own sequence head, which every generative tool here fixes to false because sequence design is run_mpnn's job. So the stage is unreachable from BOTH tools: the binder fails on line 202, the scaffold on line 204 -- in each case after the main stage has finished, discarding the generation. | 1 个月前 | |
fix: describe_tool could not describe get_job_status get_job_status, like describe_tool itself, is never loaded into the registry's own manifest set (it has no engine, so it doesn't come from manifests/*.yaml). describe_tool's _describe_one only special-cased its own name, so describe_tool(name="get_job_status") failed with "unknown tool" even though the tool itself is callable. Caught by driving describe_tool live over every tool this wave shipped, not just unit-testing get_job_status in isolation. | 1 个月前 | |
test: verify tool-generated BoltzGen specs and record live validation | 26 天前 | |
feat: require a bearer token when the HTTP transport is not on loopback --transport http served every tool to anyone who could reach the port, and every tool takes a caller-supplied filesystem path, so an unauthenticated request could name any file the server user can read and spend the GPU indefinitely. The only guard was the default bind address and a warning in --help that simultaneously explained how to remove it. Loopback binds are unchanged: no token, no friction. Any other bind requires Authorization: Bearer; if no PROTEIN_DESIGN_MCP_TOKEN is set the server mints one and prints it, so enabling remote access is still one command rather than a refusal that sends the operator looking for a worse workaround. Verified against a live server: missing, wrong, and unscheme'd tokens all get 401; the correct token reaches the MCP layer. | 1 个月前 | |
fix: image was missing the mmseqs env run_mmseqs_search declares | 1 个月前 | |
fix: correct rfdiffusion2 repo name, make mount and import tests hermetic | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
Build integrated payload in registry-sized layers | 25 天前 | |
Stabilize OpenMM minimization and pin a compatible CUDA runtime | 25 天前 | |
fix: name AlphaFold 3's PAE file, and correct what run_ipsae works with run_ipsae is described as comparable ACROSS predictors, and the methodology axis says so too. Only two of eleven predictors declared a PAE output. AlphaFold 3 carries one in confidences_json and never said so, so the tool looked incompatible with the predictor a caller is most likely to trust. Confirmed live: a two-chain AF3 prediction scored ipsae 0.040, iptm_af 0.39, pdockq 0.203. run_protenix and run_chai1 also produce a PAE and ipSAE still cannot read theirs: it parses any .cif+.json pair as AlphaFold 3 format and looks for 'pae' and 'atom_plddts', while Protenix writes 'pae'/'plddt' and Chai-1 writes 'token_pair_pae'/'atom_plddt'. That mismatch surfaces as a KeyError inside the engine, so both are now named as incompatible rather than left to be discovered. docs/TOOLS.md said 'works on any predictor's PAE'; it does not. chain_proof gains af3_pae_reaches_ipsae and mpnn_sequence_folds_alone -- the latter because run_mpnn joins chains with ':', which a folding tool neither rejects nor honours as a chain break. Five chains, all passing. | 1 个月前 | |
refactor: remove orphaned tools/ package, relocate job status query | 1 个月前 | |
feat: add get_job_status (meta tool, no engine) Wires job_status.get_design_status (already implemented, six pre-existing passing tests preserved) into the server the same way describe_tool already is: a Manifest built in code, special-cased in ServerApp.list_tools()/ call_tool() before the registry or ADAPTERS are consulted, since a tool with no engine doesn't fit the manifest+adapter+wrapper three-file pattern. Also replaces _estimate_time_remaining's hardcoded per-step timings for "rfdiffusion"/"proteinmpnn"/"esmfold" (the old composite pipeline's three steps, which no longer exist) with an estimate derived from each job's own observed progress rate instead of a fabricated table. | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
test: make live-proof coverage device-aware scripts/live_proof.py hardcoded device="cpu", so a requires.gpu:true tool could never be added to CASES without permanently breaking the coverage test, and if left out the harness silently proved nothing about it. Each case now declares its device; coverage checks the union of the cpu and cuda tool surfaces (naming the tool and device that surfaces it when missing), and each case dispatches through a server built for its own declared device instead of one shared cpu-only server. (scripts/live_proof.py itself landed already, swept into an unrelated concurrent commit on this shared checkout -- this commit is its test coverage, which was still pending.) | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
fix: check summary field and associate markers with specific mentions | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
fix: self-describe via meta_tools, fix dangling TOOLS/handle_* refs Review round 1: replace the app.py registry wrapper with a self-reference check in meta_tools._describe_one (app.py now matches the brief exactly); port modal_proxy.py's tool listing to the manifest registry (was importing the deleted TOOLS constant) with a regression test; and fail deploy/modal_app.py fast and explicitly instead of hitting an ImportError on the removed handle_* functions. | 1 个月前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
fix: accept gzipped structures in run_mpnn, and check every handoff statically run_rfdiffusion3_binder writes a GZIPPED CIF and run_mpnn's pattern was \.(pdb|cif)$, so a planned rfdiffusion3 -> mpnn workflow died on the handoff. The restriction was ours: ProDy, which LigandMPNN parses with, reads that exact file -- 4234 atoms, all selected as protein, checked in the mpnn environment. That is the third handoff found by running a workflow and watching it die, and all three were decidable from the manifests alone. scripts/handoff_matrix.py decides them at once: for every output whose description names a consumer, it tests the extension the producer writes against the pattern of every path parameter that consumer has. Back-tested against the two already fixed -- both would have been reported without spending a GPU. Two blind spots the tool had, each found by a false report it produced. A mention is not a handoff: metadata_trb names run_rfdiffusion_binder to say it has the same role and is not parsed by this tool. And a path can arrive as an ARRAY -- run_boltzgen_filter.metrics_files -- which a scalars-only check read as having nowhere to go. 19 declared handoffs, 0 mismatches. | 1 个月前 | |
fix: document chain conventions, expose co-generated sequences, let mpnn pick a chain Found by reading five generators' real outputs for the same target, not by reading source: run_genie3_binder design = chain A UNK, CA-only run_rfdiffusion2 design = chain B poly-alanine run_rfdiffusion3_binder design = chain A real sequence, 18 residue types run_protpardelle design = chain B poly-glycine run_proteina_complexa design = chain B real sequence, all-atom A, B, A, B, B -- and only run_genie3_binder said so anywhere a caller reads. An assumption carried from one generator to the next is wrong half the time, which is the same class of mistake that made v1's design_binder return the target as its own design. Every generator now states its chain convention and whether the design carries a real sequence or a placeholder. run_rfdiffusion3_binder co-generates a sequence and buried it in a gzipped CIF the result never mentioned; parse_output now returns {chain: sequence} per structure. The CIF parser reads column positions from the _atom_site header -- a fixed-index parse of that same file silently produced 504 one-residue 'chains'. run_mpnn had no way to say which chain to design, so it redesigned every chain in the file: a 504-residue target plus an 80-residue binder came back as one 585-residue sequence that is neither, and the harness's target-copy guard cannot catch a *redesigned* target. Added chains_to_design, fixed_residues and redesigned_residues, which LigandMPNN already supported. Verified live: with chains_to_design='B' the 504-residue target comes back byte-identical and only the 80-residue binder is redesigned. | 1 个月前 | |
fix: say what run_mpnn's ':' separator is and that it must be split Observed live: a round planned run_rfdiffusion3_binder -> run_mpnn -> run_boltz. run_mpnn returned a two-chain design joined as <chain A>:<chain B>, and the model handed it to run_boltz as ONE chain of 574 residues -- 70 designed plus the 504-residue target, colon removed. Boltz folded a fusion protein rather than a complex, so there was no interface, and the run_ipsae step planned after it would have had no chain pair to score. Nothing refused it. ':' is not an amino acid the validator rejects, and it is not a chain break a folding tool honours, so what comes back is a plausible structure that answers a different question than the one asked. That is a defect no schema can catch, so the output description now names the separator, says to split on it before folding, says what happens if you do not, and says which part is the design -- the chain named in chains_to_design, since the generators disagree about which one that is. chain_proof gains mpnn_design_folds_as_a_complex, which folds the split sequences and asserts the structure has as many chains as there were parts and that each one's length matches its sequence. Documentation alone would not stop this recurring. The handoff matrix needed one more exclusion: a sentence naming five generators to say they disagree about chain order is about where a DESIGN lands, not where this file goes, and it was read as five handoffs. | 1 个月前 | |
refactor: one BoltzGen refolding tool with a stated mode, not two run_boltzgen_fold and run_boltzgen_design_fold had identical parameters, identical outputs, the same engine entry and the same adapter flags. The only difference was --steps folding versus --steps design_folding: refold the design WITH its target, or ALONE. Two names for one step is not an atomistic surface, it is a caller learning twice. And the distinction is exactly the one docs/TOOLS.md already says must be a parameter: whether a prediction runs with the target present or on the binder alone is the caller's decision, and the same binder predicted alone and in complex are different experiments. So it is with_target, required and undefaulted -- defaulting would make the more consequential of the two the silent one. 39 manifests become 38. Also removes 26 stale "(not yet implemented)" notes across ten manifests. Each was true when written and stopped being true without the note changing, and the reader is a model choosing between tools: told its alternative does not exist, it does not go looking. One round planned run_boltzgen_fold to refold an RFdiffusion3 backbone -- a pairing that cannot work, since this tool reads only BoltzGen's own .cif+.npz -- while the note in front of it said the general-purpose predictors were unavailable. A test now fails on any manifest that calls an existing tool unimplemented, because the claim can only decay. run_boltzgen_fold's doc gains the two things a caller needs and did not have: that it folds only what BoltzGen generated, and that as an INDEPENDENT check it is the weakest option here -- it runs boltz2_conf_final.ckpt, a confidence model BoltzGen derived for its own designs, so scoring a BoltzGen design with it is close to asking the generator whether it agrees with itself. | 1 个月前 | |
Accept native CIF and compressed structures in OpenMM minimization | 25 天前 | |
Validate BoltzGen analysis identities before dispatch | 24 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
feat: package integrated 2.4.0 engines and public model assets | 26 天前 | |
feat: preserve campaign intermediates and engine logs across failures | 26 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
feat: enhance suggest_hotspots with UniProt, conservation, SASA, and PubMed integration | 9 个月前 | |
feat: staging/path-resolution support for array-of-path parameters Extends engine.stage (manifest.schema._validate_stage) and staging.stage_inputs to accept an array schema parameter whose items are format: path, staging every item into ONE shared workdir/<name>/ directory -- and extends app._resolve_path_params to resolve every item of such an array to an absolute path, matching the existing scalar behavior. Needed to close the run_boltzgen_design -> fold/design_fold -> analyze -> filter chain: BoltzGen's own fold/analyze steps read each design's .cif and its matching .npz out of the SAME directory (data_from_generated.py), but this project's results.collect_outputs necessarily splits a tool's declared outputs into per-spec subdirectories -- so a caller chaining two tool calls has the .cif and .npz paths in two different places. A single "generated_files" array parameter (fed the whole combined outputs list from a prior call) plus this staging extension lets an adapter reassemble them into one directory before the engine subprocess runs. Fully backward compatible: every existing scalar-path stage/resolve behavior is byte-for-byte unchanged (see the new list-specific test cases alongside the untouched existing ones). | 1 个月前 | |
Stabilize OpenMM minimization and pin a compatible CUDA runtime | 25 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
feat: add numpy-safe JSON coercion for engine results | 1 个月前 | |
fix: make our own validation the real MCP boundary mcp 1.25's Server.call_tool defaults to validate_input=True and runs jsonschema against our derived schema before our handler, so every message validation.py was written to produce (naming the parameter, the constraint, and a correct example) was dead on the wire behind the SDK's generic "Input validation error: ...". Disable SDK validation, route describe_tool through validate_and_fill like any other tool (it used to run before any validation existed for it), and return isError=True CallToolResults on every error path so a client can tell a refusal from a result. | 1 个月前 | |
release: prepare v2.0.0 -- server CMD, version, GPU default, README | 1 个月前 | |
Support external designed backbones in BoltzGen folding and recover invalid input paths | 24 天前 | |
Support external designed backbones in BoltzGen folding and recover invalid input paths | 24 天前 | |
fix: a manifest's own run_* parameter is not a cross-tool reference | 1 个月前 | |
fix: clean up lint on touched files, warn about --host 0.0.0.0 Remove the unused Resource import, fix two unsorted import blocks in server.py, and replace a bare except: in test_transport.py with except BaseException (the UP035 Sequence import in dispatch/env.py was already fixed while resolving FIX 4). Also extend --host's help text: it invites 0.0.0.0 but there is no authentication and every tool takes a caller-supplied filesystem path, so note that it must sit behind a reverse proxy or an SSH tunnel. | 1 个月前 | |
feat: enhance suggest_hotspots with UniProt, conservation, SASA, and PubMed integration | 9 个月前 | |
fix: reject leading/trailing whitespace in pattern validation PART A: Reject any string value whose .strip() differs from the value before applying pattern matching, catching whitespace that bypasses anchored patterns. PART B: Use re.fullmatch() instead of re.search() for anchored patterns (^...$) to ensure exact matches, not substring matches. | 1 个月前 | |
fix: avoid stalled Boltz data loaders and stream engine logs | 25 天前 | |
fix: close the ten container-only defects the in-container proof found - $HOME mismatch (promera/rf3/rfd3): EnvDispatcher overrides HOME for an explicit allowlist of engine repos, not every prefix-dispatched engine (a blanket default broke run_boltzgen_design's triton cache live). TRITON_CACHE_DIR is redirected unconditionally to close that class for good. - run_rfdiffusion2/run_protenix: mount the host's system CUDA toolkit (libnvrtc.so.12, nvcc+headers via CUDA_HOME) - invisible to discover_mounts by construction. - run_openfold3: apt-installs libxrender1+libxext6 (rdkit.Chem.Draw's X11 deps) and mounts its checkpoint cache with OPENFOLD_CACHE set. - run_la_proteina: wrapper now builds a writable "repo view" rooted at the scratch workdir instead of writing into the read-only mounted checkout - hydra's own realpath-based config resolution needed generate.py's containing dir to be physically real, not symlinked. - run_protpardelle: container_run.py now maps the container onto the invoking host user's uid/gid instead of the image's arbitrary default user, so a mode-640 host file stays readable exactly as it is on the host - no chmod, no broader mount. - run_chai1: adapter reads scalar fields via .item() instead of float()/bool(), which broke under numpy 2.4.6's stricter scalar-cast rules on a size-1 (not 0-d) array. Audited the other 13 adapters doing hand casts; none share the exposure. - scripts/live_proof.py: main() used to raise SystemExit on the first mismatched case, hiding every case after it. It now collects every case's outcome and reports a full table before deciding the exit code. Verified live: run6 (complete 41/41 cases run), 40/41 passed - the only failure is run_alphafold3 (FileNotFoundError: 'docker'), the accepted Ruling-4 outcome. | 1 个月前 | |
Fix engine stalls, stream diagnostics, and classify recoverable input errors | 24 天前 | |
fix: bind boltzgen fold overrides to the step that runs, explain a silent mmseqs GPU failure | 30 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 26 天前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 24 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 24 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 24 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 23 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 30 天前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 9 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 25 天前 | ||
| 25 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 26 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 26 天前 | ||
| 26 天前 | ||
| 24 天前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 24 天前 | ||
| 24 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 25 天前 | ||
| 1 个月前 | ||
| 24 天前 | ||
| 30 天前 |