github/copilot-sdk · error · InvalidOperationException

No bearer-token provider registered for provider

Error message

No bearer-token provider registered for provider "{request.ProviderName}"

What it means

BearerTokenProviderHandler resolves provider OAuth tokens by looking up a callback in CopilotSession._bearerTokenProviders. When a token is requested for a provider name that was never registered via the session's bearer-token provider registration API, the lookup fails and an InvalidOperationException is thrown.

Solutions

  1. Register a bearer-token provider callback for the exact provider name before authentication runs (RegisterBearerTokenProvider).
  2. Verify the provider name spelling and casing matches what the host/config requests.
  3. Re-register providers on the current session instance after any restart or session recreation.
  4. Catch InvalidOperationException in the token handler path and surface a clear configuration error to the user.

Example fix

// before
var session = new CopilotSession(...);
await session.Models.ListAsync(); // provider "my-llm" token request fails

// after
var session = new CopilotSession(...);
session.RegisterBearerTokenProvider("my-llm", async args => await GetTokenAsync(args.ProviderName));
Defensive patterns

Strategy: validation

Validate before calling

if (!session.IsBearerTokenProviderRegistered(providerName))
    throw new InvalidOperationException($"Register a bearer-token provider for '{providerName}' first");

Type guard

bool providerRegistered = session._bearerTokenProviders.ContainsKey(providerName); // or expose a public check

Try / catch

try { var token = await GetTokenAsync(request); }
catch (InvalidOperationException ex) when (ex.Message.Contains("No bearer-token provider registered"))
{ failFast($"Missing provider registration: {ex.Message}"); }

Prevention

When it happens

Trigger: An auth flow requests a token for request.ProviderName while no callback was registered for that exact name (case-sensitive) via RegisterBearerTokenProvider, or the session was restarted/recreated and registrations were lost.

Common situations: Typo or casing mismatch in the provider name between registration and the auth manifest; switching to a new session object without re-registering providers; using a provider defined in a model/auth config that the application never registered a handler for.

Related errors


AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09). Data as JSON: /api/errors/e1dec251eebb5665. Report an issue: GitHub.

Appendix: source

Thrown at dotnet/src/Session.cs:1269

        }
        foreach (var (name, callback) in providers)
        {
            _bearerTokenProviders[name] = callback;
        }
        ClientSessionApis.ProviderToken = new BearerTokenProviderHandler(this);
    }

    /// <summary>
    /// Routes runtime <c>providerToken.getToken</c> requests to the matching
    /// per-provider <c>BearerTokenProvider</c> callback registered on the session.
    /// </summary>
    private sealed class BearerTokenProviderHandler(CopilotSession session) : IProviderTokenHandler
    {
        public async Task<ProviderTokenAcquireResult> GetTokenAsync(ProviderTokenAcquireRequest request, CancellationToken cancellationToken = default)
        {
            if (!session._bearerTokenProviders.TryGetValue(request.ProviderName, out var callback))
            {
                throw new InvalidOperationException(
                    $"No bearer-token provider registered for provider \"{request.ProviderName}\"");
            }
            var token = await callback(new ProviderTokenArgs { ProviderName = request.ProviderName, SessionId = request.SessionId }).ConfigureAwait(false);
            return new ProviderTokenAcquireResult { Token = token };
        }
    }

    /// <summary>
    /// Sets the capabilities reported by the host for this session.
    /// </summary>
    /// <param name="capabilities">The capabilities to set.</param>
    internal void SetCapabilities(SessionCapabilities? capabilities)
    {
        Capabilities = capabilities ?? new SessionCapabilities();
    }

    internal void SetOpenCanvases(IList<OpenCanvasInstance>? canvases)
    {

View on GitHub (pinned to cd8cf15dc3)