Autoprotocol-Python is BSD licensed (see LICENSE). Before we can accept your pull request, we require that you sign a CLA (Contributor License Agreement) allowing us to distribute your work under the BSD license. Email one of the AUTHORS or for more details.

Features and Bugs

The easiest way to contribute is to fork this repository and submit a pull request. You can also submit an issue or write an email to us at if you want to discuss ideas or bugs.

Package Structure


  • Primary user interface for Autoprotocol Python
  • Represent high level abstractions around instructions, refs, and constraints
  • Have more situational checks than those in Builders or Instruction
  • Have simple arguments that are as flat as possible, ideally with no nesting
  • Don’t necessarily have a 1:1 mapping to an Instruction
    • a single call may generate multiple Instruction instances
    • a complicated, modal Instruction may have multiple corresponding Protocol methods
    • significantly complex instructions (e.g. LiquidHandle) may require parametrization with user-configurable class instances to avoid overloading the Protocol method with too many arguments


  • Constructors for nested Instruction parameters
  • Assigned to the builders attribute of their corresponding Instruction
  • Only contain checks that are valid for all instances of their corresponding Instruction
  • Check the relationship between parameters
    • a modal Instruction generally has mode_params that depend on the specified mode (e.g. LiquidHandle and Spectrophotometry.groups)
    • parameters like shape are very interdependent, and only certain combinations of rows, columns, and format are physically possible


  • Code analogue of an Autoprotocol Instruction; constructs Instruction JSON
  • __init___ parameters mirror structure of Autoprotocol Instruction
  • Only validate the type, structure, and extent of their inputs