{"record":{"id":"0e888c366607dcb8","repo":"github/copilot-sdk","slug":"no-bearer-token-provider-registered-for-provider","errorCode":null,"errorMessage":"No bearer-token provider registered for provider \"${params.providerName}\"","messagePattern":"No bearer-token provider registered for provider \"(.+?)\"","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nodejs/src/session.ts","lineNumber":1637,"sourceCode":"     * @param providers - Map of provider name → callback, or undefined/empty to clear.\n     * @internal This method is called internally when creating/resuming a session.\n     */\n    registerBearerTokenProviders(providers?: Map<string, BearerTokenProvider>): void {\n        this.bearerTokenProviders.clear();\n        if (!providers || providers.size === 0) {\n            delete this.clientSessionApis.providerToken;\n            return;\n        }\n        for (const [name, callback] of providers) {\n            this.bearerTokenProviders.set(name, callback);\n        }\n\n        const self = this;\n        this.clientSessionApis.providerToken = {\n            async getToken(params) {\n                const callback = self.bearerTokenProviders.get(params.providerName);\n                if (!callback) {\n                    throw new Error(\n                        `No bearer-token provider registered for provider \"${params.providerName}\"`\n                    );\n                }\n                const token = await callback({\n                    providerName: params.providerName,\n                    sessionId: params.sessionId,\n                });\n                return { token };\n            },\n        };\n    }\n\n    /**\n     * Registers command handlers for this session.\n     *\n     * @param commands - An array of command definitions with handlers, or undefined to clear\n     * @internal This method is typically called internally when creating/resuming a session.\n     */","sourceCodeStart":1619,"sourceCodeEnd":1655,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/nodejs/src/session.ts#L1619-L1655","documentation":"Thrown by the session's `providerToken.getToken` API when a bearer token is requested for a provider name that has no registered bearer-token provider callback in the session's registry. The SDK cannot obtain a token for an unknown provider, so it fails fast with a descriptive message.","triggerScenarios":"Calling providerToken.getToken({ providerName }) before registerBearerTokenProvider was called for that provider; misspelled or differently-cased provider name; token provider registered on a different session instance.","commonSituations":"Configuring model providers whose auth callback registration was skipped; typos like \"anthropic\" vs \"Anthropic\"; environment-specific wiring where token providers are registered only in prod bootstrap code.","solutions":["Call session.registerBearerTokenProvider(providerName, callback) for the requested provider before getToken","Fix the providerName string to exactly match the registered key","Ensure registration runs on the same CopilotSession instance and executes before token requests","Log available provider names at startup to verify wiring"],"exampleFix":"// before\nconst token = await session.providerToken.getToken({ providerName: \"anthropic\" });\n// after\nsession.registerBearerTokenProvider(\"anthropic\", async ({ providerName }) => getAuthToken(providerName));\nconst token = await session.providerToken.getToken({ providerName: \"anthropic\" });","handlingStrategy":"validation","validationCode":"const registered = session.listBearerTokenProviders?.() ?? [];\nif (!registered.includes(providerName)) {\n  session.registerBearerTokenProvider(providerName, tokenCallback);\n}","typeGuard":"function canGetToken(session, providerName) {\n  return typeof session.listBearerTokenProviders === \"function\"\n    && session.listBearerTokenProviders().includes(providerName);\n}","tryCatchPattern":"try {\n  return await session.providerToken.getToken({ providerName });\n} catch (err) {\n  if (String(err?.message).startsWith(\"No bearer-token provider registered\")) {\n    registerProvider(providerName);\n    return await session.providerToken.getToken({ providerName });\n  }\n  throw err;\n}","preventionTips":["Register token providers for every provider name referenced in config, before first use","Source provider names from the same constants/config module used at registration","Log registered provider names at startup to catch wiring gaps"],"tags":["auth","bearer-token","provider"],"backgroundTag":"missing-credentials","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}