Skip to main content
An Automation is a series of tasks (tasks) executed sequentially. Each task is either a deterministic command (such as execute_sql, which runs a named SQL query) or an agent given a prompt. Tasks compose by passing results from one to the input of another — the output of each task is accessible with Jinja as {{ name_of_task }}. You build, run, and replay Automations from the Oxygen IDE. Each Automation is stored as an .automation.yml file (the older .procedure.yml extension is still recognized for back-compat).

Automation components

Automations are DAGs comprised of tasks. Each task has a few common properties: Specific task types have additional property requirements — see Task types for the full set.

A complete example

workflows/monthly_report.automation.yml

Automations vs. chains

An Automation is similar to a “chain” in the prompt-engineering parlance, but with a few key differences:
  • Automations are DAGs. Whereas chains can become arbitrarily complex with arbitrarily nested loops, complex reply logic, and opaque branching structures, Automations are DAGs, which enforce a clearer, more predictable flow from input to output.
  • Automations separate logic from execution. Because Automations are written in YAML, the DAG definition is entirely separate from the execution engine, while other code-based systems keep these tightly coupled and so ultimately become difficult to build and maintain.
These choices generally reduce the flexibility of Oxygen when compared to say, langchain or llama_index, but they also dramatically reduce the complexity of the system. You can think of Oxygen’s Automation paradigm as a domain-specific chain-builder for data workflows, where most (if not all) tasks simply pass results around between different agents.

Next steps

Task types

agent, execute_sql, formatter, and sub-automations

Loops

Iterate over values with loop_sequential

Variables

Parameterize an Automation with typed inputs