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
- Register a bearer-token provider callback for the exact provider name before authentication runs (RegisterBearerTokenProvider).
- Verify the provider name spelling and casing matches what the host/config requests.
- Re-register providers on the current session instance after any restart or session recreation.
- 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
- Register all bearer-token providers immediately after session creation
- Verify provider name spelling/casing against the auth config
- Re-register providers after session restart or recreation
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
- GitHubToken and GitHubTokenProvider cannot be used together.
- GitHubToken and UseLoggedInUser cannot be used with CliUrl…
- Unsupported RuntimeConnection type
- CopilotClient was created with Mode =…
- CopilotClientOptions.Environment is not supported with…
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)