Use built-in and third-party plugins
Plugins connect the Scientific Agent research loop to domains, solvers, evaluators, and reporting tools. A run authorizes named capabilities such as toy.evaluate; it does not give the Reasoner unrestricted access to local programs.
Plugin states
The Plugins page exposes these states:
| State | Meaning |
|---|---|
| Available | A catalog declaration exists, but it is not installed |
| Installed | Stored and validated, but code loading is not enabled |
| Enabled | Available to new runs; plugin code will be loaded |
| Disabled | Installed but not offered to new runs |
| Unavailable | Dependency preparation, worker probing, or environment requirements failed |
An existing research contract retains its plugin and capability records. Installing, disabling, or updating a plugin primarily affects new runs.
Preinstalled and on-demand plugins
Desktop preinstalls seven reviewed project-plugin packages. Universal packages and the dependency-free symbolic baseline can share Runtime Core's process; Beam remains app-owned but uses an isolated environment for Xsuite:
| Plugin | Main capabilities | Typical use |
|---|---|---|
beam.xsuite |
tracking and stability datasets | Xsuite lattice studies and private oracle labels |
evaluation.classification |
evaluation.classification.evaluate |
Trusted classification evaluation |
evaluation.regression |
evaluation.regression.evaluate |
Trusted numeric regression evaluation |
ml.symbolic_regression.builtin |
ml.symbolic_regression.fit |
Deterministic candidate-equation baseline |
scientific.analysis |
scientific.analysis.analyze |
Analyze datasets, models, and evaluations |
scientific.knowledge |
scientific.evidence.extract, and others |
Evidence, claims, hypotheses, and verification records |
scientific.report |
scientific.report.generate |
Markdown scientific reports and SVG figures |
toy and executor.local remain Runtime reference aliases rather than managed plugin packages.
Settings → Plugins or /api/v1/capabilities is authoritative for all capabilities currently
available on the machine.
The general ml.symbolic_regression PySR provider is shipped in the local Available catalog and is
installed into an isolated environment when a symbolic-search task leases it. The enabled builtin
provider is only a bounded polynomial fallback and is not silently substituted for PySR. Other
specialized packages such as three-body are not bundled into the application. A source checkout
may expose them through approved local roots, and a user can install a separately supplied custom
ZIP. The current release has no remote plugin marketplace.
The repository also contains runnable teaching domain plugins:
physics.three_bodyfor three-body integration and surrogate dataset generation;tutorial.oscillator, the zero-dependency example built in this guide.
Use a plugin in Desktop
- Open Settings → Plugins.
- Browse Core or Domain categories.
- Expand a plugin and inspect capabilities, inputs, metric outputs, dependencies, and Runtime requirements.
- Choose Install for an Available plugin.
- Wait while Desktop automatically prepares the plugin's private dependency environment.
- Review the manifest and choose Enable; only this step probes/imports plugin code in its worker.
- When the local catalog contains a newer version, the list and detail views show the installed → available version. Choose Update to keep the plugin's existing Enabled or Disabled state.
- The default new-task page leases capabilities from the request and attachments. In Advanced setup, select only the capabilities needed for that study.
The detail view lets you review the candidate dependencies, capabilities, runtime requirements, and full manifest before updating. An update is copied to a staging directory and its manifest, dependencies, and worker are validated before the installed directory is replaced. A replacement or state-persistence failure restores the old version. A plugin cannot be updated while a nonterminal run uses it. Built-in plugins do not have an individual Update action; they are upgraded with Runtime.
Desktop uses its bundled uv executable to install declared Python dependencies into an immutable
environment owned by that plugin. It does not modify Runtime Core, another plugin, or a system
Python installation. Custom ZIP dependencies are binary-wheel-only. A separately allowlisted,
reviewed catalog plugin may automatically build a source distribution in the managed installer
environment when no wheel exists. If preparation fails, inspect the error for an unsupported
requirement, unavailable distribution, network problem, or incompatible platform; do not repair
the app's own Python environment manually.
Use a plugin from the CLI
The plugins list accepts repository-relative directories, absolute directories, and built-in aliases:
plugins:
- examples/plugins/three_body_solver
- executor.local
capabilities:
- physics.three_body.solve
- execution.local.run
Run it normally:
scientific-agent run my-study.yaml
When starting the Control API, repeat --plugin-dir to add discovery locations:
scientific-agent serve \
--plugin-dir ./my-plugins/one \
--plugin-dir ./my-plugins/two
List discovered capabilities:
curl -sS http://127.0.0.1:8000/api/v1/capabilities | jq
Install or update a custom ZIP
In Desktop, choose Install or update from ZIP and select a .zip. A valid package must:
- contain exactly one unambiguous manifest named
plugin.yaml,plugin.yml, orplugin.json; - provide an importable in-package
entrypoint; - contain no absolute paths, path traversal, symlinks, encrypted entries, or duplicates;
- be at most 10 MiB compressed, 50 MiB expanded, and 512 files.
Repository developers can produce a deterministic, versioned archive and checksum with:
python scripts/release_domain_plugin.py path/to/domain_plugin
Installation validates the ZIP and manifest, copies the package, and prepares its dependencies without importing Python code. Code is probed/imported in an isolated worker only when you choose Enable.
When the ZIP has the same plugin ID as an installed custom plugin and a strictly newer three-part manifest version (for example, 1.4.0 → 1.5.0), the same control updates it. Equal versions, downgrades, prerelease labels, and non-three-part versions are rejected; a custom ZIP also cannot replace a catalog or built-in plugin. Updating preserves the existing Enabled, Disabled, or Installed state and uses the same staging and rollback path as a catalog update.
Task-generated project plugins
When a one-request task explicitly requires a reusable tool and has produced an accepted
file-predictor-v1 model, inference source, exact evaluation artifact, accepted predictor output,
and model card, Runtime can build a plugin candidate from fixed templates. It does not accept
arbitrary plugin source or let the Reasoner edit the registry. The publisher wraps those recorded
artifacts, plus an optional solver helper and report, and records SHA-256 identities for source
artifacts and package files. Control rejects the package unless its attestation exactly matches the
frozen successful predictor and every recorded non-Runtime acceptance metric.
After the task succeeds, the candidate still passes the normal managed archive, reserved-ID,
dependency, install, and worker checks. A published entry has origin=generated; later tasks can
lease its inference capability and Settings can manage it. Its model card supplies input/output
schemas, validity domain, informational evaluation metrics, and task tags for conservative reuse;
ambiguous compatible tools are not selected silently. Applicable result exports include exactly
the published plugin ZIP, frozen model, minimal example, and instructions. Digest attestation is
not a code signature or independent scientific evidence.
Generate an adapter plugin from a solver folder
The Create page can also select a folder containing README/usage documentation and a native
executable. Web and Desktop deterministically package it as one ZIP attachment, limited to 512
regular files, 50 MiB before compression, and 10 MiB compressed. Unsafe paths, duplicates, and
limit overruns are rejected during packaging or backend validation; native Desktop selection also
rejects symlinks and special entries. Backend profiling reads at most 64 KiB of README text and
statically inspects ELF, PE, or Mach-O headers. It neither starts the binary nor extracts the whole
archive. A qualifying attachment is solver_bundle; its README excerpt is untrusted user
documentation, not execution authority.
After the operator checks the existing Allow reusable plugin publishing permission, the Agent
may implement a Python compatibility layer under file-solver-adapter-v1. It accepts
--solver-root, --solver-executable, --input, and --output; the contract requires Local
Executor to run a bounded help/version or documented-example smoke test as a child process.
The fixed runtime.solver_adapter.publish publisher accepts exactly three immutable Artifact inputs:
the original solver_bundle, generated adapter_source, and validation. It checks the validation
record's declared pass state, interface, exact bundle/source SHA-256 values, and Artifact provenance;
embedded and external attestations then bind all three Artifact IDs/SHA-256 values and every package
file. Control rechecks that three-source lineage and package digest before the managed install/enable
flow publishes an origin=generated project plugin. The validation record and attestation are not
independent proof that the smoke test actually ran. This does not relabel binary wrapping as model
training or a final predictor.
ExternalBinarySecurityReviewer is a replaceable publisher-policy interface. Its current default
explicitly returns permissive_deferred: it permits publication and records
independent_binary_review_performed=false, but performs no malware scan, signature validation,
provenance authentication, or independent binary safety review. Digest attestation proves identity
and lineage; it must not be described as a passed security review. Both smoke validation and later
adapter calls run with the current user's operating-system authority.
Choose the right capability
Open capability details and focus on:
required_inputs: ordinary fields required on every call;artifact_inputs: existing artifacts and expected types;metric_outputs: acceptance metrics the capability can support;exampleandcost_hints: valid input shape and approximate resource cost.
If several plugins implement the same abstract capability, the detail view lists each provider. The research contract records the concrete provider so an environment change cannot silently swap implementations later.
Core and Domain
- Domain plugins express operations in a scientific or problem domain, such as three-body integration and beam tracking.
- Core plugins provide cross-domain infrastructure such as execution, evaluation, analysis, knowledge management, and reporting.
The category aids discovery; it does not grant higher privilege. Special authority comes from the trusted_evaluator access role, which should be reserved for independent evaluators.
Security boundary
Managed plugins run in separate worker processes with separate Python dependency directories and without provider credentials in their process environment. This avoids dependency conflicts; it is not an operating-system security sandbox. An enabled plugin still has the current user's local authority. Install only packages from sources you trust, and inspect the manifest, dependencies, and source before enabling one.
Local Executor, generated-predictor inference, and generated external-solver adapters run as
ordinary child processes on Linux, macOS, and Windows. Runtime enforces workspace, credential
filtering, digest, timeout, and output checks, but these are not an OS sandbox; the process retains
the current user's filesystem and network authority. A
permissive_deferred external-binary reviewer status does not mean that the solver passed a
security review.
When a plugin fails
Check in this order:
- It is Enabled, not merely Installed.
- Dependency preparation produced an
environment_idand worker probing succeeded. - The research contract selected the correct capability.
- Input field names and artifact types match capability details.
- Failure, Jobs, and logs show no
load_erroror execution error.
If an upgrade changes capability names or input formats, copy the old run configuration and migrate it explicitly. Never edit a research contract after its run has started.
Managed worker protocol v1 supports ordinary ScientificPlugin packages. Custom isolated
executors are currently unsupported, and plugin-local reasoners are not transported into Desktop;
Desktop uses its configured Runtime reasoner. Direct CLI directory loads remain an in-process
developer path using the current Python environment.