LLM Copilot — An AI Assistant in the Ignition Designer, Kept Away From the Keys
The interesting engineering in this Ignition module is not the model calls. It is four RPC methods, a context budget that gates live tag values, and a credential store bound to the host it was encrypted on.
The problem
The Ignition Perspective Designer is where a controls engineer does their real work — binding tags, building session templates — and it runs in a JVM frequently attached to a plant that is currently producing. An assistant that can edit a live project is genuinely dangerous; one that can only read it is not much use. The problem was to find the smallest amount of authority worth handing to a model, inside a platform where Designer code and Gateway code run in separate processes with different reach.
The solution
Split the module across the boundary Ignition already imposes. Common holds the DTOs and a four-method RPC contract; the gateway holds the provider clients, the context gatherer and the encrypted credential store; the designer holds nothing but a Swing chat panel. Whether the model sees the plant at all is an explicit argument on the chat call rather than an ambient permission, and live tag values are only gathered when the caller asks for FULL context.
Outcomes
- One module in three jars — common, gateway and designer — so provider clients, HTTP clients and the credential store never load into the JVM that owns the project.
- A four-method RPC contract is the Designer's entire surface: it holds no API key, opens no provider socket, and decides no policy.
- `includeContext` and `contextLevel` are explicit arguments on the chat call, so access to the tag tree is requested rather than ambient.
+7 more in the write-up
Inside the write-up
- The problem with putting a model next to a running plant
- Ignition loads code in two JVMs, so the module ships in three jars
- The RPC contract is the design
- What the model is allowed to see
- Turning context into a prompt
- Secrets stay on the gateway, and are bound to the host
- Failing in a way the Designer can act on
- Where I would want to go next