Skip to content

Write Your First Operator

Audience: extension authors
Status: Preview

The current external operator path uses a manifest plus a Python entrypoint.

from ophiolite_sdk.operators import OperatorRegistry, computed_curve
registry = OperatorRegistry()
@registry.register("acme:double")
def double_curve(request):
curve = request.payload["inputs"]["input_curve"]
values = [None if value is None else value * 2.0 for value in curve["values"]]
return computed_curve("DTX", values, unit=curve.get("unit"))
{
"schema_version": 1,
"package_name": "acme-tools",
"package_version": "0.1.0",
"provider": "acme",
"runtime": "python",
"compatibility": { "ophiolite_api": "0.1.0" },
"entrypoint": "acme_ops.py",
"operators": [
{
"id": "acme:double",
"provider": "acme",
"name": "Double Curve",
"asset_family": "Log",
"category": "Demo",
"description": "Doubles a selected curve.",
"default_output_mnemonic": "DTX",
"output_curve_type": "Computed",
"input_specs": [
{
"SingleCurve": {
"parameter_name": "input_curve",
"allowed_types": []
}
}
],
"parameters": [
{
"Number": {
"name": "factor",
"label": "Factor",
"description": "Scale factor",
"default": 2.0,
"min": 0.0,
"max": 10.0,
"unit": null
}
}
],
"output_lifecycle": "derived_asset",
"deterministic": true,
"stability": "preview",
"tags": ["demo"]
}
]
}

Even for external operators, Rust still owns:

  • project locking
  • input and parameter validation
  • execution contracts
  • provenance
  • derived-asset persistence

Next: Package and install an operator