dotnet/machinelearning · error · ArgumentException

No Onnx Session Options

Error message

No Onnx Session Options

What it means

GetOnnxSessionOption retrieves registered OnnxSessionOptions from the environment, but only if the IHostEnvironment implements IHostEnvironmentInternal. Otherwise it throws ArgumentException 'No Onnx Session Options'.

Source

Thrown at src/Microsoft.ML.OnnxTransformer/OnnxSessionOptions.cs:26

using Microsoft.ML.Data;
using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.Runtime;
using Microsoft.ML.Transforms.Onnx;

namespace Microsoft.ML.Transforms.Onnx
{
    public static class OnnxSessionOptionsExtensions
    {
        private const string OnnxSessionOptionsName = "OnnxSessionOptions";

        public static OnnxSessionOptions GetOnnxSessionOption(this IHostEnvironment env)
        {
            if (env is IHostEnvironmentInternal localEnvironment)
            {
                return localEnvironment.GetOptionOrDefault<OnnxSessionOptions>(OnnxSessionOptionsName);
            }

            throw new ArgumentException("No Onnx Session Options");
        }

        public static void SetOnnxSessionOption(this IHostEnvironment env, OnnxSessionOptions onnxSessionOptions)
        {
            if (env is IHostEnvironmentInternal localEnvironment)
            {
                localEnvironment.SetOption(OnnxSessionOptionsName, onnxSessionOptions);
            }
            else
                throw new ArgumentException("No Onnx Session Options");
        }
    }

    public sealed class OnnxSessionOptions
    {
        internal void CopyTo(SessionOptions sessionOptions)
        {
            sessionOptions.EnableMemoryPattern = EnableMemoryPattern;

View on GitHub (pinned to 7b76e69cf9)

Solutions

  1. Call SetOnnxSessionOption on the environment before reading options
  2. Use a real ML.NET host environment (MLContext-based) that implements IHostEnvironmentInternal
  3. Fix test doubles to implement IHostEnvironmentInternal
  4. Catch ArgumentException and use default session options

Example fix

// before
var opts = env.GetOnnxSessionOption(); // env is plain IHostEnvironment mock
// after
if (env is IHostEnvironmentInternal)
    var opts = env.GetOnnxSessionOption();
else
    var opts = new OnnxSessionOptions(); // defaults
Defensive patterns

Strategy: type-guard

Validate before calling

if (env is IHostEnvironmentInternal internalEnv)
{
    internalEnv.SetOnnxSessionOption(new OnnxSessionOptions());
}
var opts = env is IHostEnvironmentInternal ? env.GetOnnxSessionOption() : new OnnxSessionOptions();

Type guard

bool HasOnnxOptions(IHostEnvironment env) => env is IHostEnvironmentInternal;

Try / catch

try { var o = env.GetOnnxSessionOption(); } catch (ArgumentException ex) when (ex.Message.Contains("No Onnx Session Options")) { var o = new OnnxSessionOptions(); }

Prevention

When it happens

Trigger: Calling env.GetOnnxSessionOption() on an IHostEnvironment that is not IHostEnvironmentInternal, or on an internal environment where no OnnxSessionOptions were registered via SetOnnxSessionOption (GetOptionOrDefault returning null path still requires the internal interface; the throw occurs when the cast fails).

Common situations: Using a mock or custom IHostEnvironment in tests that doesn't implement IHostEnvironmentInternal; calling before SetOnnxSessionOption was invoked on that environment.

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 dotnet/machinelearning@7b76e69cf9 (2026-09-11). Data as JSON: /api/errors/477307bbd2569689. Report an issue: GitHub.