{"record":{"id":"e1dec251eebb5665","repo":"github/copilot-sdk","slug":"no-bearer-token-provider-registered-for-provider-e1dec2","errorCode":null,"errorMessage":"No bearer-token provider registered for provider \"{request.ProviderName}\"","messagePattern":"No bearer-token provider registered for provider \"(.+?)\"","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"dotnet/src/Session.cs","lineNumber":1269,"sourceCode":"        }\n        foreach (var (name, callback) in providers)\n        {\n            _bearerTokenProviders[name] = callback;\n        }\n        ClientSessionApis.ProviderToken = new BearerTokenProviderHandler(this);\n    }\n\n    /// <summary>\n    /// Routes runtime <c>providerToken.getToken</c> requests to the matching\n    /// per-provider <c>BearerTokenProvider</c> callback registered on the session.\n    /// </summary>\n    private sealed class BearerTokenProviderHandler(CopilotSession session) : IProviderTokenHandler\n    {\n        public async Task<ProviderTokenAcquireResult> GetTokenAsync(ProviderTokenAcquireRequest request, CancellationToken cancellationToken = default)\n        {\n            if (!session._bearerTokenProviders.TryGetValue(request.ProviderName, out var callback))\n            {\n                throw new InvalidOperationException(\n                    $\"No bearer-token provider registered for provider \\\"{request.ProviderName}\\\"\");\n            }\n            var token = await callback(new ProviderTokenArgs { ProviderName = request.ProviderName, SessionId = request.SessionId }).ConfigureAwait(false);\n            return new ProviderTokenAcquireResult { Token = token };\n        }\n    }\n\n    /// <summary>\n    /// Sets the capabilities reported by the host for this session.\n    /// </summary>\n    /// <param name=\"capabilities\">The capabilities to set.</param>\n    internal void SetCapabilities(SessionCapabilities? capabilities)\n    {\n        Capabilities = capabilities ?? new SessionCapabilities();\n    }\n\n    internal void SetOpenCanvases(IList<OpenCanvasInstance>? canvases)\n    {","sourceCodeStart":1251,"sourceCodeEnd":1287,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/dotnet/src/Session.cs#L1251-L1287","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nvar session = new CopilotSession(...);\nawait session.Models.ListAsync(); // provider \"my-llm\" token request fails\n\n// after\nvar session = new CopilotSession(...);\nsession.RegisterBearerTokenProvider(\"my-llm\", async args => await GetTokenAsync(args.ProviderName));","handlingStrategy":"validation","validationCode":"if (!session.IsBearerTokenProviderRegistered(providerName))\n    throw new InvalidOperationException($\"Register a bearer-token provider for '{providerName}' first\");","typeGuard":"bool providerRegistered = session._bearerTokenProviders.ContainsKey(providerName); // or expose a public check","tryCatchPattern":"try { var token = await GetTokenAsync(request); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"No bearer-token provider registered\"))\n{ failFast($\"Missing provider registration: {ex.Message}\"); }","preventionTips":["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"],"tags":["authentication","bearer-token","configuration","dotnet"],"backgroundTag":"missing-credentials","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}