Reference implementations and publish tooling for building Optix extensions and distributing them through the Optix marketplace.
An Optix extension (also called a workload) pairs two components:
- A C# adapter (an FT Optix Additional Module) that exposes the extension's capabilities as OPC UA nodes in FT Optix Studio and Runtime
- A Python service that runs as a separate process managed by a pre-installed extension framework (such as MLServices)
The two communicate over the extension framework's IPC bridge. The extension is packaged into a Margo workload bundle and published to the Optix marketplace catalog. From there it can be pulled and installed on a target machine using the optix CLI.
The extension framework must be pre-installed on every target machine. Workloads do not bundle the runtime.
| Generic | Typed Instance | |
|---|---|---|
| C# adapter | Pre-built; shipped with the extension framework | Custom, authored per workload |
| OPC UA surface | Auto-generated from Python function signatures at design time | Authored explicitly in Module.xml |
| Instance state | Stateless | Persistent per-instance state in the framework's KV store |
| C# authoring required | No | Yes |
| Best for | Stateless compute, inference, transformation | Named instances with lifecycle; domain-specific Studio UX |
| Directory | Pattern | Description |
|---|---|---|
generic-ml-service/ |
Generic | Power function — a single stateless math function |
typed-ml-service/ |
Typed Instance | Event Logger — named logs with append, query, and delete lifecycle |
marketplace-publish/ |
— | Python publish tooling and per-sample publish.ps1 scripts |
optix-extensions-samples/
├── generic-ml-service/ # Generic pattern sample
│ ├── application-description.yaml
│ ├── workload/
│ │ ├── service/ # Python service code (no adapter)
│ │ ├── install.ps1
│ │ └── install.sh
│ └── README.md
├── typed-ml-service/ # Typed Instance pattern sample
│ ├── application-description.yaml
│ ├── workload/
│ │ ├── adapter/ # C# adapter source + Module.xml
│ │ ├── service/ # Python service code
│ │ ├── optix.yaml # Build manifest (read by optix build)
│ │ ├── install.ps1
│ │ └── install.sh
│ └── README.md
└── marketplace-publish/ # Publish tooling
├── core/ # Python publish library
├── generic-ml-service/ # publish.ps1 + product.json for generic sample
├── typed-ml-service/ # publish.ps1 + product.json for typed sample
└── README.md
- Generic pattern → generic-ml-service/README.md
- Typed Instance pattern → typed-ml-service/README.md
- Publishing to the marketplace → marketplace-publish/README.md
Rockwell Automation maintains these repositories as a convenience to you and other users. Although Rockwell Automation reserves the right at any time and for any reason to refuse access to edit or remove content from this Repository, you acknowledge and agree to accept sole responsibility and liability for any Repository content posted, transmitted, downloaded, or used by you. Rockwell Automation has no obligation to monitor or update Repository content
The examples provided are to be used as a reference for building your application and should not be used in production as-is. It is recommended to adapt the example for the purpose, of observing the highest safety standards.
License: Distributed under the MIT License.