DocumentationPricingJoin Waitlist

Getting Started

  • Introduction
  • Installation & Setup

Features

  • Modules
  • Platform
  • Recipes

Cluster

  • Details & Setup
  • Tasks, Actions & Agents
    • Tasks
    • Actions
    • Agents
    • Workers
    • Sessions
    • Monitoring
  • Assets & Files

API Reference

  • Command-Line Interface
  • Recipe Development
  • Recipes API

Tasks, Actions & Agents

Use Ellf to set up tasks, actions and agents for you

If you’ve connected Ellf to your coding assistant, it will be able to create and start tasks, actions and agents for you. You can also use the in-app chat and reference resources via @, for example to start a task using a data source, train from a dataset or assign an agent to a running task.

Tasks

Tasks are workflows that preprocess and queue up data for annotation or review and start the annotation server. They are created from a recipe, a Python function describing the workflow and its available settings. You can also think of tasks as an instance of a given recipe with a specific configuration. Tasks can be created in the UI or via the CLI and once started, annotators will be able to connect to them and create annotations.

Annotate entitiesSTARTED

Named Entity Recognitionner
Annotations
512
Annotators
3

To create a new task, you can navigate to TasksNew task in the UI or use tasks create on the command line. The available settings are automatically converted into a web form and CLI arguments.

Command-line usage
$ellf

tasks

create

ner"Annotate entities"

--dataset "NER News"

--input "News Headlines"

--label PERSON,ORG,PRODUCT,LOCATION

--model.name en_core_web_trf

To start a task, you can run tasks start with the name or ID of the created task:

Starting the task
$ellf

tasks

start

"Annotate entities"

This will start the annotation server and will allow human annotators and annotation agents to connect and create data. Each time an annotator connects to the interface, a new session is created and the annotations and sessions can be viewed in the app. Annotations are saved into the provided dataset, which can then be used by other tasks and actions, e.g. to review the data or train a model, or exported to a file.

Review and correct dataSTOPPED

Review Annotationsreview
Annotations
133
Annotators
2

Train a pipelineSTARTING

Train a spaCy pipelinetrain
Executions
42
Last execution
2 hours ago

Actions

Actions are workflows that execute any logic and exit. They’re created from a recipe, a Python function describing the workflow and its available settings. You can also think of actions as an instance of a given recipe with a specific configuration, similar to jobs running in a CI system like GitHub Actions. Actions can be created in the UI or via the CLI and have access to all resources on your cluster, so they can be used to train a model from your data, perform data analysis, trigger deployment or integrate Ellf with other tools and services.

Train a pipelineSTARTED

Train a spaCy pipelinetrain
Executions
42
Last execution
2 hours ago

To create a new action, you can navigate to ActionsNew action in the UI or use actions create on the command line. The available settings are automatically converted into a web form and CLI arguments.

Command-line usage
$ellf

actions

create

print_dataset_or_file_length"My first action"--data-input "News Headlines"

To start an action, you can run actions start with the name or ID of the created action:

Starting the action
$ellf

actions

start

"My first action"

This will create a new execution, run the code and save all output to the logs. Actions can have many executions over time – for instance, for regular training runs, end-to-end testing, deployment or data import and export.


Agents

Agents are autonomous workers and annotators that can be assigned to tasks. They’re created from a recipe, a Python function describing the agent’s intended behavior, its available settings and the type of work it’s specialized for. Agents are typically powered by LLMs and can use models running on the cluster or access them via APIs. When assigned to an annotation task, an agent will run in the background and automatically create annotated data in its own dataset.

Auto-labeler for NERSTARTED

Gemini Annotation Agentgemini_agent

To create a new agent, you can navigate to AgentsNew agent in the UI or use agents create on the command line. The available settings are automatically converted into a web form and CLI arguments. If API keys are required, you can use Ellf’s built-in secrets feature.

Command-line usage
$ellf

agents

create

gemini_agent"My first agent"

--model gemini-2.0-flash

--api-key GEMINI_API_KEY

To start an agent, you can run agents start with the name or ID of the created agent:

Starting the agent
$ellf

agents

start

"My first agent"

Once started, the agent will automatically discover its assigned task servers, fetch tasks, annotate them using the logic defined in the recipe, and submit the results. Each agent runs in its own session and creates annotations in the task’s dataset, just like a human annotator would. You can assign agents to tasks via TasksAssign agent in the UI or using agents assign on the CLI.

Assigning the agent to a task
$ellf

agents

assign

--task "Annotate entities"

Agents support two optional settings that control their runtime behavior: poll_interval sets how frequently the agent checks for new tasks (in seconds), and idle_shutdown_seconds configures how long the agent will wait without tasks before shutting down automatically. These are defined as parameters in the agent recipe and can be configured when creating the agent. For details on building your own agent recipes, see the recipe development guide and the @agent_recipe API reference.

Use Ellf to iterate on label scheme

To make the most of annotation agents, its crucial to have a well-defined and consistent label scheme. You can use Ellf’s project planning and data annotation modules to guide you through the process, before starting an annotation agent or incorporating human annotators.


Workers

Task, actions and agents can have different cloud hardware requirements and may require a high-performance CPU or GPU to run or train machine learning models. When starting a task, action or agent, you can customize the worker class to be used so that the cluster can provision the required workers. For example, you can change the worker used by an action by clicking the arrow on the Start action button or by setting the --worker-class argument on the CLI.

Selecting a worker
$ellf

actions

start

"My first action"--worker-class gpu

By default, the cluster is set up to provide the workers base, small, medium and gpu. See the cluster documentation for more details on their specs and how to define custom workers.


Annotation sessions

Once a task is running, annotators with access to it can navigate to it in their dashboard and open the annotation UI. You’ll be able to see their work and monitor the activity as it happens. You can also click the Annotate now button on the task page to annotate yourself. A session counts every time a user opens the annotation UI, until they navigate away from it. This means that the same user can start multiple sessions over time and create annotations during those sessions.

Task overview page in the app
Task overview page in the app

The annotations tab lists the annotated examples with an inline preview. On click, it shows the example and its underlying JSON data, which depends on the data type and interface used. Editing an example will create a copy, save it from your user account and mark the edited example as disabled, so it’s excluded from any further processes. Once an example is added to the database, it can never be changed in place. This ensures that no data points are lost and you’ll always be able to compute accurate metrics like inter-annotator agreement.

Visual data view
Visual data view
JSON data view
JSON data view

Under the hood, the database includes the JSON data of each example, as well as its full config containing both global settings as well as settings specific to the interface (for instance, the available labels, whether multiple-choice options are mutually exclusive, or how the interface should behave). This ensures that each example can be displayed exactly as the annotator saw it.

The database also stores whether an example is marked as disabled, which excludes it from any further processes. This can be useful to manually exclude mistakes and soft-delete examples, or when editing an example, which will create a copy with the edits and disable the original example so no data points are lost.

The icons and colors on the avatars correspond to Prodigy’s accept, reject and ignore buttons and indicate whether the annotator has accepted, rejected or ignored the example. The distinction between accept and reject is especially relevant in binary workflows where annotators decide whether a suggestion is correct or not, or during data curation to indicate whether an example should be included or not.

Examples marked as ignore are skipped and it’s recommended to encourage annotators to skip examples if they’re unsure to record this information and to not disrupt the annotation flow by spending too long on a single decision. You can later filter and review ignored examples to potentially spot problems or relevant edge cases in your data or improve your annotation guidelines.

The total annotation time you see in the task sidebar and overviews is the sum of the time spent by all annotators across their sessions. So if 4 annotators spend 15 minutes each annotating, this will add up to 1 hour of total time.

Ellf will start a new session when a user opens the annotation UI. When to close it can be tricky if the user doesn’t explicitly exit the app: we want to account for periods of inactivity, like short breaks or annotation decisions that take a longer time to complete, but eventually, the session needs to be closed so the queue of examples can be “released” to other annotators. This is why Ellf allows for longer inactivity before a session times out.

The annotation app will periodically save in the background, while keeping the most recent annotations on the client only to make it easy to undo previous decisions, without causing conflicts with the database or model in the loop. To ensure data privacy, no annotations are persisted in the browser’s local storage.

If a session times out or the user exits without saving, the queue of examples and most recent annotations are released again so other annotators can work on them, if Prodigy is configured to divide data up between annotators. When the annotator resumes, a new session will be started. If the internet connection was interrupted and the browser tab is still open, they’ll be able to submit their unsaved annotations via the save button or CMD+S once they’re connected again.


Monitoring and observability

The monitoring module lets you check in on the status of your running tasks, actions and agents. It can report scores and potential problems for actions like model training, task state, progress and activity for annotation tasks and annotation agents.

✳︎Claude Code: Checking on a training action
› /ellf-monitor How’s the NER training going?
⏺︎
Jobner-product-names-v2 (action)
Staterunning — step 800
Best score0.81 (ents_f) at step 720
Train loss0.52 (stable)
AlertsNone

Training looks healthy. The score has been improving steadily and there are no signs of overfitting or loss instability.

Read next
Assets & Files

from the makers of spaCy and Prodigy

Navigation

  • Home
  • Documentation

Platform

  • Pricing
  • Waitlist

Resources

  • Case Studies
  • Blog
Terms & ConditionsPrivacy PolicyImprint© 2026 Explosion