Skip to content

Long-Running Ensemble Example

This example shows how to configure and start an ensemble in long-running mode with shared tasks and tools.

Basic Long-Running Ensemble

Long-running mode requires a WebDashboard configured with the desired port. The webDashboard() builder method starts the server; start() transitions the lifecycle to READY and registers the JVM shutdown hook.

import net.agentensemble.Ensemble;
import net.agentensemble.Task;
import net.agentensemble.ensemble.EnsembleLifecycleState;
import net.agentensemble.web.WebDashboard;

import java.time.Duration;

public class LongRunningExample {

    public static void main(String[] args) {
        // Configure your LLM provider -- for example:
        // ChatModel model = OpenAiChatModel.builder().apiKey(...).build();

        // Create the WebDashboard bound to the desired port
        WebDashboard dashboard = WebDashboard.builder().port(7329).build();

        // Define tasks to share with the network
        Task prepareMeal = Task.builder()
                .description("Prepare a meal as specified")
                .expectedOutput("Confirmation with preparation details and timing")
                .build();

        // Build the ensemble with the dashboard wired in
        Ensemble kitchen = Ensemble.builder()
                .chatLanguageModel(model)
                .task(Task.of("Manage kitchen operations"))
                .shareTask("prepare-meal", prepareMeal)
                .webDashboard(dashboard)  // required for long-running mode; also starts server
                .drainTimeout(Duration.ofMinutes(2))
                .build();

        // Transition to READY; port is advisory for error messages / logs
        kitchen.start(7329);
        System.out.println("State: " + kitchen.getLifecycleState());
        // Output: State: READY

        // The ensemble runs until stop() is called or the JVM shuts down.
        // A shutdown hook is registered automatically.
    }
}

Checking Lifecycle State

// Create dashboard and build ensemble (see above for full setup)
WebDashboard dashboard = WebDashboard.builder().port(7329).build();
Ensemble ensemble = Ensemble.builder()
        .chatLanguageModel(model)
        .task(Task.of("Manage operations"))
        .webDashboard(dashboard)
        .build();

ensemble.start(7329);

// Check the current state
EnsembleLifecycleState state = ensemble.getLifecycleState();
System.out.println(state); // READY

// Graceful shutdown
ensemble.stop();
System.out.println(ensemble.getLifecycleState()); // STOPPED

Shared Capabilities

// Share both tasks and tools
WebDashboard dashboard = WebDashboard.builder().port(7329).build();

Ensemble kitchen = Ensemble.builder()
        .chatLanguageModel(model)
        .task(Task.of("Manage kitchen operations"))

        // Full task delegation -- other ensembles hand off work (EN-004)
        .shareTask("prepare-meal", Task.builder()
                .description("Prepare a meal as specified")
                .expectedOutput("Confirmation with prep time and details")
                .build())

        // Lightweight tool sharing -- other agents call directly (EN-005)
        .shareTool("check-inventory", inventoryTool)
        .shareTool("dietary-check", allergyCheckTool)

        .webDashboard(dashboard)
        .build();

See Also