Operator UI

Start and monitor your Runs in real time from the production floor.

Screenshot of TofuPilot Operator UI

Overview

The Operator UI lets you run and track test procedures deployed on your production stations. It provides a simple, focused interface for production operators to start tests, respond to prompts, and monitor progress live.

Integration

The Operator UI is currently available with OpenHTF. Python client support is coming soon.

Prerequisites

Upgrade the Python client to version ≥ 1.11.0

pip install --upgrade tofupilot

How it works

  1. Run your OpenHTF script.

  2. You'll see a message like this in your console:

    Connected to TofuPilot real-time server
    Access Operator UI: [clickable_URL_to_Operator_UI]
  3. Click the URL to open the Operator UI in TofuPilot.

Script example

Below is a test script using OpenHTF and TofuPilot. The test begins with a serial number prompt. It combines automated checks (e.g., power_on) and operator input (e.g., prompt_operator_led_color, prompt_operator_next_step), reflecting typical production workflows.

OpenHTF
import openhtf as htf
from openhtf.plugs.user_input import UserInput
from openhtf.plugs import user_input
from tofupilot.openhtf import TofuPilot
import time


def power_on():
    time.sleep(1)
    return htf.PhaseResult.CONTINUE


@htf.plug(user_input=UserInput)
def prompt_operator_next(user_input):
    user_input.prompt(
        message="Click Next when the LED turn on",
        text_input=False,  # Button prompt from operator
    )


@htf.measures(htf.Measurement("led_color").equals("Green"))
@htf.plug(user_input=UserInput)
def prompt_operator_led_color(test, user_input):
    led_color = user_input.prompt(
        message="What is the LED color? (Green/Red/Blue)",
        text_input=True,  # Text prompt from operator
    )
    test.measurements.led_color = led_color


def main():
    test = htf.Test(
        power_on,
        prompt_operator_next,
        prompt_operator_led_color,
        procedure_id="FVT1",
        part_number="PCB1",
    )
    with TofuPilot(test):
        test.execute(test_start=user_input.prompt_for_test_start())  # Prompt at start


if __name__ == "__main__":
    main()

Prompt configuration

Use user_input.prompt(message, text_input) to show instructions or questions to the operator in the UI. Depending on the prompt type, the UI will either show a text input field or a simple Next button.

user_input.prompt("What is the LED color?", text_input=True)
  • Name
    openhtf.plugs.user_input.prompt(message, text_input)
    Type
    str → str
    Description

    Displays a text prompt in the UI and returns the operator's response.

  • Name
    message
    Type
    str
    Description

    The instruction or question shown to the operator in the UI.

  • Name
    text_input
    Type
    bool
    Description

    If True, the prompt displays a text box for operator input (e.g., typing "Green"). If False, it shows a "Next" button.

Streaming control

By default, test results are streamed live to the Operator UI. To disable streaming:

with TofuPilot(test, stream=False):

In-app view

The Operator UI connects your test scripts to real-time visibility on the production floor. When a test starts, a unique URL appears in your console — follow it to view live test streaming.

You'll see:

  • Prompts and operator responses
  • Procedure metadata (ID, name, version)
  • Run info (UUID, duration, logs)
  • Phases and measurements (status, value(s), limits, units, durations, attachments)
  • User or station info (based on the API key)

Live Test Streaming

The Operator UI updates in real time as the test progresses. In this screenshot, the test has completed and is now waiting for the next execution to begin. The previous test has been uploaded to TofuPilot and we can see information about the previous test (status, procedure ID, ...).

Test view showing procedure metadata, run information, and a completed test waiting for a new prompt.

Manual Serial Number Input

Some procedures start with a manual input, typically a serial number. To ensure this input is collected before the test starts, pass the user prompt as the test_start parameter when calling test.execute() (see code example above).

Manual serial number input box with loaded procedure metadata waiting for a DUT ID.

Even before the test is started, you can already see the associated metadata: procedure ID, part number, part revision, and hardware revision. The serial number will be displayed when user will submit it.

Custom Operator Prompts

You can configure custom prompts in your test script. In this example, the operator is asked to confirm the LED color during test. This allows you to combine automated steps with manual validation.

Prompt asking the operator to enter the color of an LED before continuing the test.

Phase and Measurement Details

Each test phase is displayed as it runs, along with its duration and result. You can track all measurement types in real time — numeric, string, boolean, or even tables — along with their units, limits, validator, and status.

Real-time view of test phases and measurements including values, limits, units, and pass/fail status.

Was this page helpful?