elsa-workflows/elsa-core · error · InvalidOperationException

The output binding has no converter configuration.

Error message

The output binding has no converter configuration.

What it means

Thrown by OutputConverterInvoker.Invoke when an activity Output has no Converter configured. Elsa's output binding pipeline requires an OutputConverter (identified by an ID resolvable through the registry) to transform a raw output value into the destination type; without one the invocation cannot proceed.

Solutions

  1. Assign a converter to the Output, typically via the OutputDescriptor so the correct OutputConverterConfiguration is created automatically.
  2. If constructing Output manually, set output.Converter = new OutputConverter { Id = <registered converter id> } matching a converter registered in the OutputConverterRegistry.
  3. Migrate/re-save legacy workflow definitions so outputs are rebuilt with converter configuration by the current activity descriptor.
  4. If the value needs no conversion, use the default output helpers (e.g., Output<T> created through OutputReference/descriptor) rather than a bare Output.

Example fix

// before
public Output MyOutput { get; set; } = new();

// after: let the descriptor create a properly configured output
[Output] public Output<int> MyOutput { get; set; } = default!;
Defensive patterns

Strategy: type-guard

Validate before calling

if (output.Converter is null)
    throw new InvalidOperationException($"Output '{outputName}' has no converter configured; create outputs via their OutputDescriptor.");

Type guard

bool HasConverter(Output? o) => o?.Converter is not null;

Try / catch

try
{
    var result = await OutputConverterInvoker.InvokeAsync(output, outputName, sourceType, value, destination);
}
catch (InvalidOperationException ex) when (ex.Message.Contains("no converter configuration"))
{
    logger.LogError(ex, "Output {Name} lacks a converter; falling back to raw value", outputName);
}

Prevention

When it happens

Trigger: Accessing an output (e.g., GetResult/Get) whose Output instance was constructed manually or deserialized without setting Output.Converter, or writing a custom activity that creates Output objects without assigning a converter configuration.

Common situations: Hand-written activity outputs that bypass OutputDescriptor-driven creation, older workflow definitions persisted before converters were introduced being loaded by a newer runtime, and copy/pasted Output construction in custom activities.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


AI-assisted analysis of elsa-workflows/elsa-core@fe9217bdfa (2026-09-13). Data as JSON: /api/errors/1d51a816462a9914. Report an issue: GitHub.

Appendix: source

Thrown at src/modules/Elsa.Workflows.Core/Services/OutputConverterInvoker.cs:21

using Microsoft.Extensions.DependencyInjection;

namespace Elsa.Workflows;

/// <inheritdoc />
public class OutputConverterInvoker(
    IOutputConverterRegistry registry,
    IOutputConverterSettingsValidator settingsValidator) : IOutputConverterInvoker
{
    /// <inheritdoc />
    public object? Invoke(
        ActivityExecutionContext activityExecutionContext,
        Output output,
        string outputName,
        Type sourceType,
        object value,
        OutputBindingDestination destination)
    {
        var configuration = output.Converter ?? throw new InvalidOperationException("The output binding has no converter configuration.");
        var descriptor = registry.Find(configuration.Id);

        if (descriptor == null)
            throw CreateException(OutputConversionFailureStage.Resolution);

        if (!IsRuntimeValueCompatible(value, sourceType) || !descriptor.SourceType.IsAssignableFrom(sourceType))
            throw CreateException(OutputConversionFailureStage.SourceCompatibility);

        if (!OutputConverterRegistry.IsAssignableToDestination(descriptor.ResultType, destination.Type))
            throw CreateException(OutputConversionFailureStage.ResultValidation);

        IOutputConverter converter;

        try
        {
            converter = activityExecutionContext.WorkflowExecutionContext.ServiceProvider
                .GetRequiredKeyedService<IOutputConverter>(configuration.Id);
        }

View on GitHub (pinned to fe9217bdfa)