pen-stack 6.3.1__tar.gz → 6.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pen_stack-6.3.1 → pen_stack-6.4.0}/CHANGELOG.md +35 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/CITATION.cff +1 -1
- {pen_stack-6.3.1 → pen_stack-6.4.0}/PKG-INFO +16 -2
- {pen_stack-6.3.1 → pen_stack-6.4.0}/README.md +15 -1
- pen_stack-6.4.0/configs/oracles/execution.yaml +87 -0
- pen_stack-6.4.0/docs/live_oracles.md +56 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/__init__.py +1 -1
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/api/manifest.py +9 -2
- pen_stack-6.4.0/pen_stack/oracles/genome.py +167 -0
- pen_stack-6.4.0/pen_stack/oracles/protein_design.py +136 -0
- pen_stack-6.4.0/pen_stack/oracles/status.py +103 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/vcell.py +28 -5
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/server/api.py +9 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/web/guide.py +7 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/providers.py +33 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack.egg-info/PKG-INFO +16 -2
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack.egg-info/SOURCES.txt +3 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pyproject.toml +1 -1
- pen_stack-6.3.1/pen_stack/oracles/genome.py +0 -68
- pen_stack-6.3.1/pen_stack/oracles/protein_design.py +0 -45
- {pen_stack-6.3.1 → pen_stack-6.4.0}/LICENSE +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/MANIFEST.in +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/bench/run.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/antipeg.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/cell_types.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/datasets.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/llm.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/oracles/scope_cards.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/score_axes.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/target_sites.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/write_types.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/BACKLOG.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/DEPLOY.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/INFRA.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/MCP.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/RELEASING.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/REPRO.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/STABILITY.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/agent.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/autonomy.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/biosecurity.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/build_interface.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/cards/atlas.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/cards/durability.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/cards/safety.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/challenge.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/closed_loop.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/co_scientist.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/delivery.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/digital_twin.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/dissemination.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/environment.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/experiment_design.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/generative_design.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/index.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/integrations.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/oracles.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/positioning.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/private_data_formats.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/quickstart.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/responsible_use.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/rules.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/scope.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/scorecard.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/uncertainty.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/verify.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/world_model.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/writer_verification.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/docs/wtkb.md +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/_resources.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/active/design.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/mcp_server.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/cli.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/design/space.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/web/router.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/web/server.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/paper1.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/paper2.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/paper3.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/paper4.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/phase0.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.3.1 → pen_stack-6.4.0}/setup.cfg +0 -0
|
@@ -3,6 +3,41 @@
|
|
|
3
3
|
All notable changes to PEN-STACK are documented here. This file follows
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/) and the program's phase structure.
|
|
5
5
|
|
|
6
|
+
## [6.4.0] - 2026-06-12 - v6.4.0: Live Oracles (the foundation models actually execute)
|
|
7
|
+
|
|
8
|
+
**The oracle mesh goes live.** The foundation-model adapters that were deferred contracts now run real backends —
|
|
9
|
+
without touching the no-fabrication invariant (generated outputs stay candidates, OOD inputs are flagged, a down
|
|
10
|
+
backend defers). Live execution is opt-in via `PEN_STACK_ORACLE_NET=1`; with the flag unset (CI/offline) every
|
|
11
|
+
oracle behaves exactly as before. MINOR feature release on the stable 6.x API. Workstream WS-LIVE.
|
|
12
|
+
|
|
13
|
+
### Added — live oracles
|
|
14
|
+
- **Evo2-40B (hosted)** — `oracles/genome.py::generate_dna` calls NVIDIA's hosted Evo2-40B (real generated DNA +
|
|
15
|
+
per-token probability). ~1–3 s.
|
|
16
|
+
- **AlphaGenome (hosted)** — `oracles/genome.py::variant_effect` **connected to the existing v3.1
|
|
17
|
+
`wgenome.AlphaGenomeProvider`** (added `score_variant`; no duplicate client) — a real regulatory variant-effect
|
|
18
|
+
magnitude. ~2–10 s. (AlphaGenome already ran live in v3.1 for expression/tracks/contact — 416 cached predictions.)
|
|
19
|
+
- **ProteinMPNN / ESM3-open / RFdiffusion (local GPU)** — `model_servers/{proteinmpnn,esm3,rfdiffusion}` small
|
|
20
|
+
FastAPI servers on the VM GPU (reuse `penstack:phase1.5` / `rfdiffusion:base`); `oracles/protein_design.py`
|
|
21
|
+
HTTP-calls them. ProteinMPNN ~1–9 s, ESM3 ~1–2 s warm, RFdiffusion ~1–2 min. `docker-compose.models.yml` starts
|
|
22
|
+
them on demand.
|
|
23
|
+
- **Execution + latency surface** — `configs/oracles/execution.yaml` + `oracles/status.py` (`oracle_status`,
|
|
24
|
+
`summary`) + `GET /oracles` + the chat meta facts: per-oracle execution, **latency class**
|
|
25
|
+
(instant/seconds/slow/long_job), and live status, so the assistant states the cost before running anything.
|
|
26
|
+
|
|
27
|
+
### Held / honestly deferred
|
|
28
|
+
- **AlphaFold3 · Boltz-2 · Chai-1 · Protenix** — HELD: need a rented A100/H100 (24–80 GB; AF3 also ~1 TB
|
|
29
|
+
databases). Run **separately** on cloud, never on the 16 GB VM and never in the request path.
|
|
30
|
+
- **Arc STATE / scGPT** — package verified installable (`pip install arc-state`; SE-600M embeds cells), but a
|
|
31
|
+
trustworthy perturbation **outcome** needs the State-Transition model + a reference scRNA pipeline, and even
|
|
32
|
+
SOTA doesn't beat naive baselines (Arc VCC) — so the magnitude stays a known-unknown, honestly deferred
|
|
33
|
+
(uniform gated hook added via `PEN_STACK_VCELL_URL` for when an ST server is stood up).
|
|
34
|
+
|
|
35
|
+
### Verified on the VM (RTX A4000)
|
|
36
|
+
Evo2-40B generation ~1.2 s; AlphaGenome variant score `chr22:36201698 A>C` max|effect| 3.15 over 14,652 tracks
|
|
37
|
+
in 3.6 s; ProteinMPNN designed real ubiquitin-fold sequences (global_score ~0.80) in ~9 s; ESM3-open completed the
|
|
38
|
+
ubiquitin sequence from a partial prompt in 1.4 s warm; RFdiffusion diffused a real 60-residue backbone in ~105 s.
|
|
39
|
+
All generated outputs remain candidates (`as_claim()` raises).
|
|
40
|
+
|
|
6
41
|
## [6.3.1] - 2026-06-12 - v6.3.1: router fix — general "how does it work" no longer misrouted to the meta lane
|
|
7
42
|
|
|
8
43
|
**Patch (routing correctness).** Found by a rigorous full-stack test pass (every oracle + every endpoint + the 4
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.4.0
|
|
4
4
|
Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
|
|
5
5
|
Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -90,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
90
90
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
91
91
|
[](LICENSE)
|
|
92
92
|
[](https://www.python.org/)
|
|
93
|
-
[](CHANGELOG.md)
|
|
94
94
|
[](docs/STABILITY.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -148,6 +148,20 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
148
148
|
> unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
|
|
149
149
|
> hidden.
|
|
150
150
|
|
|
151
|
+
## What is new in v6.4 — Live Oracles (the foundation models actually execute)
|
|
152
|
+
|
|
153
|
+
The foundation-model oracles now **run for real**, not just defer: **ViennaRNA** (in-process), **AlphaGenome**
|
|
154
|
+
(free DeepMind API — variant effect + regulatory tracks), **Evo2-40B** (NVIDIA hosted — DNA generation),
|
|
155
|
+
**ProteinMPNN** / **ESM3-open** / **RFdiffusion** (local GPU model servers). Each is opt-in via
|
|
156
|
+
`PEN_STACK_ORACLE_NET=1`; with the flag off, every oracle behaves exactly as before — and the no-fabrication
|
|
157
|
+
invariant is untouched (generated outputs stay **candidates**, OOD inputs are flagged, a down backend **defers**).
|
|
158
|
+
|
|
159
|
+
A new **execution + latency surface** (`GET /oracles`, `configs/oracles/execution.yaml`) tells you the cost up
|
|
160
|
+
front: *instant* / *seconds* / *slow* (~1–2 min, warn) / *long_job*. The cloud-A100 structure models
|
|
161
|
+
(AlphaFold3 · Boltz-2 · Chai-1 · Protenix) are **held on purpose** — they run **separately** on a rented A100,
|
|
162
|
+
never on the 16 GB VM and never in the request path. Arc STATE's perturbation **outcome** stays honestly
|
|
163
|
+
deferred (it needs the State-Transition model + a reference scRNA pipeline). See [docs/live_oracles.md](docs/live_oracles.md).
|
|
164
|
+
|
|
151
165
|
## What is new in v6.3 — The Hybrid Co-Scientist (grounded engine + general intelligence)
|
|
152
166
|
|
|
153
167
|
The chat now does three things at once without ever blurring them: it **runs the engine** for genome-writing
|
|
@@ -15,7 +15,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
15
15
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://www.python.org/)
|
|
18
|
-
[](CHANGELOG.md)
|
|
19
19
|
[](docs/STABILITY.md)
|
|
20
20
|
[](tests/)
|
|
21
21
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -73,6 +73,20 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
73
73
|
> unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
|
|
74
74
|
> hidden.
|
|
75
75
|
|
|
76
|
+
## What is new in v6.4 — Live Oracles (the foundation models actually execute)
|
|
77
|
+
|
|
78
|
+
The foundation-model oracles now **run for real**, not just defer: **ViennaRNA** (in-process), **AlphaGenome**
|
|
79
|
+
(free DeepMind API — variant effect + regulatory tracks), **Evo2-40B** (NVIDIA hosted — DNA generation),
|
|
80
|
+
**ProteinMPNN** / **ESM3-open** / **RFdiffusion** (local GPU model servers). Each is opt-in via
|
|
81
|
+
`PEN_STACK_ORACLE_NET=1`; with the flag off, every oracle behaves exactly as before — and the no-fabrication
|
|
82
|
+
invariant is untouched (generated outputs stay **candidates**, OOD inputs are flagged, a down backend **defers**).
|
|
83
|
+
|
|
84
|
+
A new **execution + latency surface** (`GET /oracles`, `configs/oracles/execution.yaml`) tells you the cost up
|
|
85
|
+
front: *instant* / *seconds* / *slow* (~1–2 min, warn) / *long_job*. The cloud-A100 structure models
|
|
86
|
+
(AlphaFold3 · Boltz-2 · Chai-1 · Protenix) are **held on purpose** — they run **separately** on a rented A100,
|
|
87
|
+
never on the 16 GB VM and never in the request path. Arc STATE's perturbation **outcome** stays honestly
|
|
88
|
+
deferred (it needs the State-Transition model + a reference scRNA pipeline). See [docs/live_oracles.md](docs/live_oracles.md).
|
|
89
|
+
|
|
76
90
|
## What is new in v6.3 — The Hybrid Co-Scientist (grounded engine + general intelligence)
|
|
77
91
|
|
|
78
92
|
The chat now does three things at once without ever blurring them: it **runs the engine** for genome-writing
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# How each oracle EXECUTES + its per-query latency class (PEN-STACK v6.4 "Live Oracles").
|
|
2
|
+
#
|
|
3
|
+
# This is the "tell the user the cost up front" table: before an oracle runs, the assistant can state how it
|
|
4
|
+
# executes and how long it will take, so latency is never a surprise.
|
|
5
|
+
#
|
|
6
|
+
# latency_class:
|
|
7
|
+
# instant — < 1 s (answer inline)
|
|
8
|
+
# seconds — ~1–10 s (answer inline)
|
|
9
|
+
# slow — ~10 s – 2 min (WARN: "running <model> on the GPU, ~N…", then answer)
|
|
10
|
+
# long_job — minutes–hours (WARN + run SEPARATELY on cloud; never block the chat)
|
|
11
|
+
#
|
|
12
|
+
# execution:
|
|
13
|
+
# in_process — runs in the engine process (no extra service)
|
|
14
|
+
# hosted_api — a free cloud API (no local GPU); needs a key
|
|
15
|
+
# local_gpu — a local model server on the VM GPU (start on demand); needs PEN_STACK_ORACLE_NET=1
|
|
16
|
+
# cloud_a100 — HELD: needs a rented A100/H100 (run separately, not active now)
|
|
17
|
+
# deferred — honestly deferred (would require a deeper pipeline; never fabricated)
|
|
18
|
+
oracles:
|
|
19
|
+
viennarna:
|
|
20
|
+
execution: in_process
|
|
21
|
+
latency_class: instant
|
|
22
|
+
live: always
|
|
23
|
+
note: "ViennaRNA MFE fold — runs in-process."
|
|
24
|
+
|
|
25
|
+
alphagenome:
|
|
26
|
+
execution: hosted_api
|
|
27
|
+
latency_class: seconds
|
|
28
|
+
live_when: "configs/alphagenome_api_key.txt (or ALPHAGENOME_API_KEY) present + PEN_STACK_ORACLE_NET=1"
|
|
29
|
+
note: "Free DeepMind AlphaGenome API (variant effect + expression/tracks/contact). ~2–10 s."
|
|
30
|
+
|
|
31
|
+
evo2:
|
|
32
|
+
execution: hosted_api
|
|
33
|
+
latency_class: seconds
|
|
34
|
+
live_when: "NVIDIA key present + PEN_STACK_ORACLE_NET=1"
|
|
35
|
+
note: "NVIDIA hosted Evo2-40B (DNA generation). ~1–3 s for short generations."
|
|
36
|
+
|
|
37
|
+
proteinmpnn:
|
|
38
|
+
execution: local_gpu
|
|
39
|
+
latency_class: seconds
|
|
40
|
+
server: "penmodel:proteinmpnn — http://localhost:9011"
|
|
41
|
+
note: "Sequence design for a backbone PDB. ~1–9 s."
|
|
42
|
+
|
|
43
|
+
esm3:
|
|
44
|
+
execution: local_gpu
|
|
45
|
+
latency_class: seconds
|
|
46
|
+
server: "penmodel:esm3 — http://localhost:9012"
|
|
47
|
+
note: "ESM3-open 1.4B protein generation/completion. ~1–2 s warm (~60 s cold weight download)."
|
|
48
|
+
|
|
49
|
+
rfdiffusion:
|
|
50
|
+
execution: local_gpu
|
|
51
|
+
latency_class: slow
|
|
52
|
+
server: "penmodel:rfdiffusion — http://localhost:9013"
|
|
53
|
+
note: "Backbone diffusion. ~1–2 min per backbone — WARN the user before running."
|
|
54
|
+
|
|
55
|
+
state:
|
|
56
|
+
execution: deferred
|
|
57
|
+
latency_class: long_job
|
|
58
|
+
live: false
|
|
59
|
+
note: "Arc STATE: `pip install arc-state` (SE-600M embeds cells). A trustworthy perturbation OUTCOME needs the
|
|
60
|
+
State-Transition model + a reference scRNA population; even SOTA doesn't beat naive baselines (Arc VCC), so
|
|
61
|
+
the magnitude stays a known-unknown — honestly deferred, never fabricated."
|
|
62
|
+
scgpt:
|
|
63
|
+
execution: deferred
|
|
64
|
+
latency_class: long_job
|
|
65
|
+
live: false
|
|
66
|
+
note: "scGPT virtual-cell — honestly deferred (same rationale as Arc STATE)."
|
|
67
|
+
|
|
68
|
+
alphafold3:
|
|
69
|
+
execution: cloud_a100
|
|
70
|
+
latency_class: long_job
|
|
71
|
+
live: false
|
|
72
|
+
note: "HELD — run SEPARATELY on a cloud A100/H100 80 GB (+ ~1 TB databases). ~10 min–hours. Not active now."
|
|
73
|
+
boltz-2:
|
|
74
|
+
execution: cloud_a100
|
|
75
|
+
latency_class: long_job
|
|
76
|
+
live: false
|
|
77
|
+
note: "HELD — run SEPARATELY on a cloud A100 (24–48 GB). ~1–10 min. Not active now."
|
|
78
|
+
chai-1:
|
|
79
|
+
execution: cloud_a100
|
|
80
|
+
latency_class: long_job
|
|
81
|
+
live: false
|
|
82
|
+
note: "HELD — run SEPARATELY on a cloud A100 (24 GB+). ~1–10 min. Not active now."
|
|
83
|
+
protenix:
|
|
84
|
+
execution: cloud_a100
|
|
85
|
+
latency_class: long_job
|
|
86
|
+
live: false
|
|
87
|
+
note: "HELD — run SEPARATELY on a cloud A100. ~1–10 min. Not active now."
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Live Oracles (v6.4)
|
|
2
|
+
|
|
3
|
+
PEN-STACK's foundation-model oracles can **actually execute** — not just defer. v6.4 wires the live paths and
|
|
4
|
+
adds an honest **execution + latency** surface so the assistant tells you the cost *before* it runs anything.
|
|
5
|
+
|
|
6
|
+
## The no-fabrication invariant is unchanged
|
|
7
|
+
|
|
8
|
+
Live or deferred, the rule holds: a generative output is a **candidate** (`as_claim()` raises), an OOD input is
|
|
9
|
+
flagged `extrapolating`, and when a backend is down the adapter **defers** — it never fabricates a number.
|
|
10
|
+
Turning a model "on" is opt-in via **`PEN_STACK_ORACLE_NET=1`**; with the flag unset (CI / offline) every oracle
|
|
11
|
+
behaves exactly as before.
|
|
12
|
+
|
|
13
|
+
## What runs where, and how long
|
|
14
|
+
|
|
15
|
+
| Oracle | Execution | Latency | How to enable |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| **ViennaRNA** | in-process | **instant** (<1 s) | always on |
|
|
18
|
+
| **AlphaGenome** | hosted API (free) | **seconds** (~2–10 s) | `configs/alphagenome_api_key.txt` + `PEN_STACK_ORACLE_NET=1` |
|
|
19
|
+
| **Evo2-40B** | hosted API (NVIDIA) | **seconds** (~1–3 s) | `configs/nvidia_api_key.txt` + `PEN_STACK_ORACLE_NET=1` |
|
|
20
|
+
| **ProteinMPNN** | local GPU server :9011 | **seconds** (~1–9 s) | start the model server + `PEN_STACK_ORACLE_NET=1` |
|
|
21
|
+
| **ESM3-open 1.4B** | local GPU server :9012 | **seconds** (~1–2 s warm) | start the model server + flag |
|
|
22
|
+
| **RFdiffusion** | local GPU server :9013 | **slow** (~1–2 min) | start the model server + flag *(warn the user)* |
|
|
23
|
+
| Arc STATE / scGPT | deferred | long_job | perturbation **outcome** needs the State-Transition model + a reference scRNA pipeline; honestly deferred |
|
|
24
|
+
| AlphaFold3 · Boltz-2 · Chai-1 · Protenix | **HELD** (cloud A100) | long_job | run **separately** on a rented A100/H100; not active now |
|
|
25
|
+
|
|
26
|
+
Query the live status any time: `GET /oracles` (add `?probe=true` to ping the local servers), or
|
|
27
|
+
`pen_stack.oracles.status.summary()`.
|
|
28
|
+
|
|
29
|
+
## Starting the local GPU model servers (on demand)
|
|
30
|
+
|
|
31
|
+
The local models run as small FastAPI services on the VM GPU — start only what you need:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# build bases once (penstack:phase1.5 already on the VM; rfdiffusion:base from the RFdiffusion repo)
|
|
35
|
+
docker compose -f docker-compose.models.yml up -d proteinmpnn esm3 # the fast ones
|
|
36
|
+
docker compose -f docker-compose.models.yml up -d rfdiffusion # the slow one (~1–2 min/run)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Then run the engine with the live flag + keys:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
PEN_STACK_ORACLE_NET=1 \
|
|
43
|
+
NVIDIA_API_KEY=$(cat configs/nvidia_api_key.txt) \
|
|
44
|
+
ALPHAGENOME_API_KEY=$(cat configs/alphagenome_api_key.txt) \
|
|
45
|
+
uvicorn pen_stack.web.server:app --port 8000
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Latency policy ("tell the user up front")
|
|
49
|
+
|
|
50
|
+
- **instant / seconds** → answered inline.
|
|
51
|
+
- **slow** (RFdiffusion) → *"Running RFdiffusion on the GPU, ~1–2 min…"* then the result.
|
|
52
|
+
- **long_job** (AF3 / Boltz / Chai / Protenix) → *"This needs a cloud A100 and takes minutes — run it separately"*;
|
|
53
|
+
never silently blocks the chat.
|
|
54
|
+
|
|
55
|
+
The cloud-A100 structure models are **held on purpose** (see the v6.4 changelog): they can be run via these same
|
|
56
|
+
oracle adapters by pointing them at a cloud GPU, just not on the 16 GB VM and not in the request path.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.
|
|
2
|
+
__version__ = "6.4.0"
|
|
@@ -57,12 +57,19 @@ def capability_manifest() -> dict[str, Any]:
|
|
|
57
57
|
"guarantees": ["rule-grounded legality", "calibrated confidence", "explicit scope / known-unknowns",
|
|
58
58
|
"biosecurity safety gate", "no fabrication"],
|
|
59
59
|
"tools": _TOOLS,
|
|
60
|
-
"
|
|
61
|
-
|
|
60
|
+
"oracles": _oracle_summary(),
|
|
61
|
+
"surfaces": {"rest": "/capabilities, /scope, /oracles, /verify, /generate, /predict, /immune, /safety, "
|
|
62
|
+
"/suggest, /session, /openapi.json", "mcp": "pen_stack.agent.mcp_server",
|
|
62
63
|
"challenge": "benchmarks/genome_writing_challenge"},
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
|
|
67
|
+
def _oracle_summary() -> dict:
|
|
68
|
+
"""Live-oracle roll-up (v6.4): which foundation models execute live, their latency class, what is held/deferred."""
|
|
69
|
+
from pen_stack.oracles.status import summary
|
|
70
|
+
return summary()
|
|
71
|
+
|
|
72
|
+
|
|
66
73
|
def _known_unknowns() -> list[dict]:
|
|
67
74
|
"""The known-unknowns as PUBLIC data (id/title/requires/why) — internal matcher fields are not exposed."""
|
|
68
75
|
from pen_stack.agent.scope import load_registry
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""Genome oracles (v4.0, WS-O1) — AlphaGenome / Evo2 / accessibility baselines, under one contract.
|
|
2
|
+
|
|
3
|
+
AlphaGenome (regulatory tracks + variant effect) is **OOD-gated**: scoring a locus outside the model's
|
|
4
|
+
training distribution sets `extrapolating=True` / `in_scope=False` (the model does not generalize to unseen
|
|
5
|
+
loci — labelled, not hidden). Evo2 supplies a likelihood/zero-shot *claim*-scope scalar and, separately,
|
|
6
|
+
*generated DNA candidates* (output_kind=candidate → cannot enter a claim path). ChromBPNet/Borzoi are kept as
|
|
7
|
+
honest baselines. Heavy backends run on-demand and are cached; when absent the adapter defers (or replays a
|
|
8
|
+
committed cache entry) rather than fabricating a value.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
import re
|
|
14
|
+
|
|
15
|
+
from pen_stack.oracles import build_result, cache_get, cache_put
|
|
16
|
+
from pen_stack.oracles.schema import OracleResult
|
|
17
|
+
|
|
18
|
+
# ---- hosted Evo2-40B (NVIDIA) — live path, opt-in via PEN_STACK_ORACLE_NET=1 (CI stays offline by default) ----
|
|
19
|
+
_EVO2_URL = "https://health.api.nvidia.com/v1/biology/arc/evo2-40b/generate"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _oracle_net_enabled() -> bool:
|
|
23
|
+
"""Live oracle network calls are opt-in (the deployed VM sets it; CI/offline leave it unset → deferred)."""
|
|
24
|
+
return os.getenv("PEN_STACK_ORACLE_NET") == "1"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _nvidia_key() -> str | None:
|
|
28
|
+
key = os.getenv("NVIDIA_API_KEY")
|
|
29
|
+
if key:
|
|
30
|
+
return key.strip()
|
|
31
|
+
from pen_stack._resources import project_root
|
|
32
|
+
f = project_root() / "configs" / "nvidia_api_key.txt"
|
|
33
|
+
return f.read_text(encoding="utf-8").strip() if f.exists() else None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _sanitize_dna(s: str) -> str:
|
|
37
|
+
return "".join(c for c in (s or "").upper() if c in "ACGTN")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _call_evo2_generate(seed: str, n: int) -> dict:
|
|
41
|
+
import requests
|
|
42
|
+
key = _nvidia_key()
|
|
43
|
+
if not key:
|
|
44
|
+
raise RuntimeError("no NVIDIA_API_KEY for hosted Evo2")
|
|
45
|
+
body = {"sequence": seed, "num_tokens": int(n), "top_k": 4, "enable_sampled_probs": True}
|
|
46
|
+
r = requests.post(_EVO2_URL, headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
|
|
47
|
+
json=body, timeout=float(os.getenv("PEN_STACK_ORACLE_TIMEOUT", "120")))
|
|
48
|
+
r.raise_for_status()
|
|
49
|
+
return r.json()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _deferred_or_cached(oracle: str, model: str, inputs: dict, *, extrapolating: bool = False,
|
|
53
|
+
in_scope: bool = True, output_kind: str | None = None,
|
|
54
|
+
backend_note: str = "backend not installed") -> OracleResult:
|
|
55
|
+
r = build_result(oracle, model, inputs=inputs, available=False, extrapolating=extrapolating,
|
|
56
|
+
in_scope=in_scope, output_kind=output_kind, note=backend_note)
|
|
57
|
+
hit = cache_get(r.provenance.cache_key)
|
|
58
|
+
if hit is not None:
|
|
59
|
+
return build_result(oracle, model, inputs=inputs, value=hit.get("value"),
|
|
60
|
+
native_uncertainty=hit.get("native_uncertainty"), available=True, cached=True,
|
|
61
|
+
source="cache", extrapolating=extrapolating, in_scope=in_scope,
|
|
62
|
+
output_kind=output_kind, note="replayed from committed oracle cache")
|
|
63
|
+
return r
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
_VAR_RE = re.compile(r"(?:(chr[\w]+)[:\s]*)?(\d+)?\s*([ACGT]+)\s*>\s*([ACGT]+)", re.I)
|
|
67
|
+
_LOCUS_RE = re.compile(r"(chr[\w]+)[:\s]*(\d+)?", re.I)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _parse_variant(variant: str, locus: str):
|
|
71
|
+
"""Parse a variant ('chr1:1000 A>T' / 'chr1:1A>T' / 'A>G' + locus 'chr19:1010000') -> (chrom,pos,ref,alt)."""
|
|
72
|
+
m = _VAR_RE.search(variant or "")
|
|
73
|
+
if not m:
|
|
74
|
+
return None
|
|
75
|
+
chrom, pos, ref, alt = m.group(1), m.group(2), m.group(3), m.group(4)
|
|
76
|
+
if not chrom or not pos:
|
|
77
|
+
lm = _LOCUS_RE.search(locus or "")
|
|
78
|
+
if lm:
|
|
79
|
+
chrom = chrom or lm.group(1)
|
|
80
|
+
pos = pos or lm.group(2)
|
|
81
|
+
if not (chrom and pos and ref and alt):
|
|
82
|
+
return None
|
|
83
|
+
return chrom, int(pos), ref.upper(), alt.upper()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def variant_effect(variant: str, locus: str, in_distribution: bool = True) -> OracleResult:
|
|
87
|
+
"""AlphaGenome variant-effect prediction, OOD-gated by `in_distribution`.
|
|
88
|
+
|
|
89
|
+
LIVE via the existing `wgenome.AlphaGenomeProvider` (real `score_variant`, REF vs ALT) when
|
|
90
|
+
`PEN_STACK_ORACLE_NET=1` and the alphagenome package + key are present; otherwise deferred / cache-replay
|
|
91
|
+
(value None, OOD gate intact, never fabricated). Reuses the v3.1 provider — no duplicate client."""
|
|
92
|
+
inputs = {"variant": variant, "locus": locus}
|
|
93
|
+
parsed = _parse_variant(variant, locus)
|
|
94
|
+
if _oracle_net_enabled() and parsed:
|
|
95
|
+
from pen_stack.wgenome.providers import AlphaGenomeProvider
|
|
96
|
+
prov = AlphaGenomeProvider()
|
|
97
|
+
if prov.available():
|
|
98
|
+
chrom, pos, ref, alt = parsed
|
|
99
|
+
try:
|
|
100
|
+
rec = prov.score_variant(chrom, pos, ref, alt)
|
|
101
|
+
except Exception as e: # noqa: BLE001 - hosted/network; defer honestly, never fabricate
|
|
102
|
+
return _deferred_or_cached("genome", "alphagenome", inputs, extrapolating=not in_distribution,
|
|
103
|
+
in_scope=in_distribution,
|
|
104
|
+
backend_note=f"AlphaGenome score_variant failed ({type(e).__name__}); deferred")
|
|
105
|
+
if rec.get("available"):
|
|
106
|
+
return build_result(
|
|
107
|
+
"genome", "alphagenome", inputs=inputs,
|
|
108
|
+
value={"effect_max_abs": rec["effect_max_abs"], "effect_mean_abs": rec["effect_mean_abs"],
|
|
109
|
+
"output": rec["output"], "n_scores": rec["n_scores"],
|
|
110
|
+
"chrom": chrom, "position": pos, "ref": ref, "alt": alt},
|
|
111
|
+
available=True, source="hosted_api", extrapolating=not in_distribution, in_scope=in_distribution,
|
|
112
|
+
note=("AlphaGenome score_variant (REF vs ALT, recommended RNA_SEQ scorer): max|effect| over the "
|
|
113
|
+
"predicted regulatory tracks. A regulatory-effect magnitude, not a claim the edit works."))
|
|
114
|
+
# deferred / cache-replay — package/key/flag absent or variant unparseable (OOD gate preserved, no fabrication)
|
|
115
|
+
return _deferred_or_cached("genome", "alphagenome", inputs, extrapolating=not in_distribution,
|
|
116
|
+
in_scope=in_distribution,
|
|
117
|
+
backend_note="AlphaGenome deferred (set PEN_STACK_ORACLE_NET=1 + package/key to score live)")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def sequence_likelihood(seq: str) -> OracleResult:
|
|
121
|
+
"""Evo2 zero-shot sequence likelihood — a claim-scope scalar (NOT a generated sequence)."""
|
|
122
|
+
inputs = {"seq_len": len(seq), "seq": seq.upper()}
|
|
123
|
+
try:
|
|
124
|
+
import evo2 # noqa: F401
|
|
125
|
+
except Exception: # noqa: BLE001
|
|
126
|
+
return _deferred_or_cached("genome", "evo2", inputs, output_kind="claim",
|
|
127
|
+
backend_note="Evo2 backend not installed (large; on-demand)")
|
|
128
|
+
return build_result("genome", "evo2", inputs=inputs, output_kind="claim", available=False,
|
|
129
|
+
note="Evo2 present; wire likelihood scoring for the live value")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def generate_dna(prompt: str, n: int = 20) -> OracleResult:
|
|
133
|
+
"""Evo2 generative DNA — a CANDIDATE (output_kind=candidate); cannot enter a claim path unverified.
|
|
134
|
+
|
|
135
|
+
LIVE via NVIDIA's hosted Evo2-40B when `PEN_STACK_ORACLE_NET=1` and an NVIDIA key is present: Evo2 conditions
|
|
136
|
+
on a DNA context (the seed) and extends it; the per-token model probability is surfaced as native uncertainty.
|
|
137
|
+
Otherwise deferred / cache-replay (value None, never fabricated). The result is still a CANDIDATE — a generated
|
|
138
|
+
sequence is a proposal, not a claim (`as_claim()` raises)."""
|
|
139
|
+
seed = _sanitize_dna(prompt)
|
|
140
|
+
inputs = {"prompt": prompt, "seed": seed, "n": int(n)}
|
|
141
|
+
if _oracle_net_enabled() and _nvidia_key() and seed:
|
|
142
|
+
key_obj = build_result("genome", "evo2", inputs=inputs, output_kind="candidate")
|
|
143
|
+
try:
|
|
144
|
+
resp = _call_evo2_generate(seed, n)
|
|
145
|
+
except Exception as e: # noqa: BLE001 - hosted/network; fall back to deferred honestly (no fabrication)
|
|
146
|
+
return _deferred_or_cached("genome", "evo2", inputs, output_kind="candidate",
|
|
147
|
+
backend_note=f"hosted Evo2 call failed ({type(e).__name__}); deferred")
|
|
148
|
+
continuation = _sanitize_dna(resp.get("sequence", "")) # hosted endpoint returns the continuation only
|
|
149
|
+
probs = resp.get("sampled_probs") or []
|
|
150
|
+
mean_p = (sum(probs) / len(probs)) if probs else None
|
|
151
|
+
unc = round(1.0 - mean_p, 4) if mean_p is not None else None
|
|
152
|
+
val = {"generated": continuation, "full": seed + continuation, "seed": seed,
|
|
153
|
+
"per_token_prob": probs, "n_tokens": len(continuation), "elapsed_ms": resp.get("elapsed_ms")}
|
|
154
|
+
cache_put(key_obj.provenance.cache_key, {"value": val, "native_uncertainty": unc})
|
|
155
|
+
return build_result("genome", "evo2", inputs=inputs, value=val, native_uncertainty=unc,
|
|
156
|
+
available=True, source="hosted_api", output_kind="candidate",
|
|
157
|
+
note=("Evo2-40B (NVIDIA hosted) extended the DNA seed; per-token model probability "
|
|
158
|
+
"surfaced as uncertainty. CANDIDATE — verify (writer-verification) before any claim."))
|
|
159
|
+
return _deferred_or_cached("genome", "evo2", inputs, output_kind="candidate",
|
|
160
|
+
backend_note="Evo2 generation is a CANDIDATE; verify before any claim")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def accessibility_baseline(locus: str) -> OracleResult:
|
|
164
|
+
"""ChromBPNet/Borzoi accessibility/expression — an honest BASELINE comparator to AlphaGenome."""
|
|
165
|
+
inputs = {"locus": locus}
|
|
166
|
+
return _deferred_or_cached("genome", "chrombpnet_borzoi", inputs, output_kind="baseline",
|
|
167
|
+
backend_note="ChromBPNet/Borzoi baseline; on-demand")
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Protein-design oracles (v4.0, WS-O3) — RFdiffusion / ProteinMPNN / ESM3, all CANDIDATES.
|
|
2
|
+
|
|
3
|
+
Every output here is a generative **candidate** (output_kind=candidate): a backbone, a designed sequence, or
|
|
4
|
+
an ESM3 design. By the contract (`OracleResult.as_claim()` raises) and a guard test, none of these can enter a
|
|
5
|
+
claim path without passing writer-verification (WS-WV) scoring against measured data — the encoded
|
|
6
|
+
pen-assemble lesson (0 validatable de-novo writers; we score/critique, never assert function). Heavy backends
|
|
7
|
+
run on-demand; absent → deferred candidate.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
from pen_stack.oracles import build_result, cache_get, cache_put
|
|
14
|
+
from pen_stack.oracles.schema import OracleResult
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _oracle_net_enabled() -> bool:
|
|
18
|
+
"""Live oracle calls are opt-in (the VM sets it; CI/offline leave it unset → deferred)."""
|
|
19
|
+
return os.getenv("PEN_STACK_ORACLE_NET") == "1"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _model_server(env_var: str, default: str) -> str:
|
|
23
|
+
return os.getenv(env_var, default).rstrip("/")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _post(url: str, payload: dict, timeout_env: str = "PEN_STACK_MODEL_TIMEOUT", default_timeout: str = "600"):
|
|
27
|
+
import requests
|
|
28
|
+
r = requests.post(url, json=payload, timeout=float(os.getenv(timeout_env, default_timeout)))
|
|
29
|
+
r.raise_for_status()
|
|
30
|
+
return r.json()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _candidate(model: str, inputs: dict, backend: str, note: str) -> OracleResult:
|
|
34
|
+
r = build_result("protein_design", model, inputs=inputs, available=False, output_kind="candidate", note=note)
|
|
35
|
+
hit = cache_get(r.provenance.cache_key)
|
|
36
|
+
if hit is not None:
|
|
37
|
+
return build_result("protein_design", model, inputs=inputs, value=hit.get("value"), available=True,
|
|
38
|
+
cached=True, source="cache", output_kind="candidate",
|
|
39
|
+
note="replayed from committed oracle cache (still a CANDIDATE)")
|
|
40
|
+
try:
|
|
41
|
+
__import__(backend)
|
|
42
|
+
except Exception: # noqa: BLE001
|
|
43
|
+
return r
|
|
44
|
+
return build_result("protein_design", model, inputs=inputs, available=False, output_kind="candidate",
|
|
45
|
+
note=f"{model} present; wire the generator (output stays a CANDIDATE)")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def generate_backbone(spec: dict, model: str = "rfdiffusion") -> OracleResult:
|
|
49
|
+
"""RFdiffusion / RFdiffusion-AA backbone generation — a CANDIDATE.
|
|
50
|
+
|
|
51
|
+
LIVE via the local RFdiffusion model server (`PEN_STACK_RFDIFFUSION_URL`, default localhost:9013) when
|
|
52
|
+
`PEN_STACK_ORACLE_NET=1`, the spec gives a `length` or `contigs`, and the service is up: RFdiffusion
|
|
53
|
+
diffuses a real backbone PDB (still a CANDIDATE — verify before any claim). Otherwise deferred."""
|
|
54
|
+
inputs = {"spec": spec}
|
|
55
|
+
length = (spec or {}).get("length") if isinstance(spec, dict) else None
|
|
56
|
+
contigs = (spec or {}).get("contigs") if isinstance(spec, dict) else None
|
|
57
|
+
if _oracle_net_enabled() and (length or contigs):
|
|
58
|
+
key_obj = build_result("protein_design", model, inputs=inputs, output_kind="candidate")
|
|
59
|
+
url = _model_server("PEN_STACK_RFDIFFUSION_URL", "http://localhost:9013")
|
|
60
|
+
payload = {k: v for k, v in {"length": length, "contigs": contigs,
|
|
61
|
+
"num_designs": spec.get("num_designs", 1)}.items() if v is not None}
|
|
62
|
+
try:
|
|
63
|
+
resp = _post(f"{url}/generate", payload, default_timeout="1200")
|
|
64
|
+
except Exception: # noqa: BLE001 - service down → defer honestly
|
|
65
|
+
return _candidate(model, inputs, "rfdiffusion",
|
|
66
|
+
"RFdiffusion server unreachable; deferred CANDIDATE (start the model server)")
|
|
67
|
+
designs = resp.get("designs") or []
|
|
68
|
+
val = {"designs": designs, "n": len(designs), "contigs": resp.get("contigs"),
|
|
69
|
+
"n_residues": (designs[0].get("n_residues") if designs else None)}
|
|
70
|
+
cache_put(key_obj.provenance.cache_key, {"value": val})
|
|
71
|
+
return build_result("protein_design", model, inputs=inputs, value=val, available=True,
|
|
72
|
+
source="local_gpu", output_kind="candidate",
|
|
73
|
+
note=("RFdiffusion diffused a backbone (local GPU). CANDIDATE — design a sequence "
|
|
74
|
+
"(ProteinMPNN) + verify fold/activity before any claim."))
|
|
75
|
+
return _candidate(model, inputs, "rfdiffusion",
|
|
76
|
+
"RFdiffusion backbone is a CANDIDATE; verify before any claim")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def design_sequence(backbone: dict, model: str = "proteinmpnn") -> OracleResult:
|
|
80
|
+
"""ProteinMPNN / LigandMPNN sequence design for a fixed backbone — a CANDIDATE.
|
|
81
|
+
|
|
82
|
+
LIVE via the local ProteinMPNN model server (`PEN_STACK_PROTEINMPNN_URL`, default localhost:9011) when
|
|
83
|
+
`PEN_STACK_ORACLE_NET=1`, the backbone carries a `pdb`, and the service is up; the designed sequences are a
|
|
84
|
+
real ProteinMPNN output (still a CANDIDATE — `as_claim()` raises). Otherwise deferred / cache-replay."""
|
|
85
|
+
inputs = {"backbone": backbone}
|
|
86
|
+
pdb = (backbone or {}).get("pdb") if isinstance(backbone, dict) else None
|
|
87
|
+
if _oracle_net_enabled() and isinstance(pdb, str) and "ATOM" in pdb:
|
|
88
|
+
key_obj = build_result("protein_design", model, inputs=inputs, output_kind="candidate")
|
|
89
|
+
url = _model_server("PEN_STACK_PROTEINMPNN_URL", "http://localhost:9011")
|
|
90
|
+
try:
|
|
91
|
+
resp = _post(f"{url}/design", {"pdb": pdb, "chains": backbone.get("chains"),
|
|
92
|
+
"num_seqs": int(backbone.get("num_seqs", 4))})
|
|
93
|
+
except Exception: # noqa: BLE001 - service down/unreachable → defer honestly (no fabrication)
|
|
94
|
+
return _candidate(model, inputs, "proteinmpnn",
|
|
95
|
+
"ProteinMPNN server unreachable; deferred CANDIDATE (start the model server to design)")
|
|
96
|
+
designs = resp.get("designs") or []
|
|
97
|
+
best = min((d.get("global_score") for d in designs if d.get("global_score") is not None), default=None)
|
|
98
|
+
val = {"designs": designs, "n": len(designs), "best_global_score": best}
|
|
99
|
+
cache_put(key_obj.provenance.cache_key, {"value": val})
|
|
100
|
+
return build_result("protein_design", model, inputs=inputs, value=val, available=True,
|
|
101
|
+
source="local_gpu", output_kind="candidate",
|
|
102
|
+
note=("ProteinMPNN designed sequences for the backbone (local GPU). CANDIDATE — score "
|
|
103
|
+
"against measured data (writer-verification) before any claim."))
|
|
104
|
+
return _candidate(model, inputs, "proteinmpnn",
|
|
105
|
+
"ProteinMPNN sequence is a CANDIDATE; score against measured data before any claim")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def esm3_design(prompt: dict, model: str = "esm3") -> OracleResult:
|
|
109
|
+
"""ESM3 generative protein design / representation — a CANDIDATE.
|
|
110
|
+
|
|
111
|
+
LIVE via the local ESM3-open model server (`PEN_STACK_ESM3_URL`, default localhost:9012) when
|
|
112
|
+
`PEN_STACK_ORACLE_NET=1`, the prompt gives a masked `sequence` or a `length`, and the service is up: ESM3
|
|
113
|
+
generates a real protein (still a CANDIDATE — verify fold/activity before any claim). Otherwise deferred."""
|
|
114
|
+
inputs = {"prompt": prompt}
|
|
115
|
+
seq = (prompt or {}).get("sequence") if isinstance(prompt, dict) else None
|
|
116
|
+
length = (prompt or {}).get("length") if isinstance(prompt, dict) else None
|
|
117
|
+
if _oracle_net_enabled() and (seq or length):
|
|
118
|
+
key_obj = build_result("protein_design", model, inputs=inputs, output_kind="candidate")
|
|
119
|
+
url = _model_server("PEN_STACK_ESM3_URL", "http://localhost:9012")
|
|
120
|
+
payload = {k: v for k, v in {"sequence": seq, "length": length,
|
|
121
|
+
"num_steps": prompt.get("num_steps"),
|
|
122
|
+
"temperature": prompt.get("temperature")}.items() if v is not None}
|
|
123
|
+
try:
|
|
124
|
+
resp = _post(f"{url}/generate", payload)
|
|
125
|
+
except Exception: # noqa: BLE001 - service down → defer honestly
|
|
126
|
+
return _candidate(model, inputs, "esm",
|
|
127
|
+
"ESM3 server unreachable; deferred CANDIDATE (start the model server to design)")
|
|
128
|
+
val = {"sequence": resp.get("sequence"), "length": resp.get("length"),
|
|
129
|
+
"num_steps": resp.get("num_steps"), "model": resp.get("backend")}
|
|
130
|
+
cache_put(key_obj.provenance.cache_key, {"value": val})
|
|
131
|
+
return build_result("protein_design", model, inputs=inputs, value=val, available=True,
|
|
132
|
+
source="local_gpu", output_kind="candidate",
|
|
133
|
+
note=("ESM3-open generated a protein sequence (local GPU). CANDIDATE — verify "
|
|
134
|
+
"fold/activity (writer-verification) before any claim."))
|
|
135
|
+
return _candidate(model, inputs, "esm",
|
|
136
|
+
"ESM3 design is a CANDIDATE; verify fold/activity before any claim")
|