github/copilot-sdk · error
GitHubToken and GitHubTokenProvider cannot be used together
Error message
GitHubToken and GitHubTokenProvider cannot be used together
What it means
SessionConfig allows supplying a GitHub token either directly (GitHubToken) or via a provider function (GitHubTokenProvider), but not both. CreateSession rejects the combination explicitly to avoid ambiguity about which credential source wins.
Solutions
- Remove GitHubToken and keep only GitHubTokenProvider, or vice versa.
- Audit config-merging code so only one credential source survives the merge.
- Prefer GitHubTokenProvider for dynamic/refreshing credentials.
Example fix
// before
cfg := &SessionConfig{GitHubToken: "ghp_...", GitHubTokenProvider: provider}
// after
cfg := &SessionConfig{GitHubTokenProvider: provider} Defensive patterns
Strategy: validation
Validate before calling
if cfg.GitHubToken != "" && cfg.GitHubTokenProvider != nil { return errors.New("set only one of GitHubToken / GitHubTokenProvider") } Try / catch
if _, err := client.CreateSession(ctx, cfg); err != nil && strings.Contains(err.Error(), "cannot be used together") { /* fix config */ } Prevention
- Centralize SessionConfig construction
- Keep one credential source per config
- Prefer GitHubTokenProvider for dynamic credentials
When it happens
Trigger: Calling Client.CreateSession with config.GitHubToken non-empty AND config.GitHubTokenProvider non-nil.
Common situations: Merging default config with user config where both sources set a token; migrating from static tokens to providers while leaving the old field populated.
Related errors
- failed to set model: AutoTier and ResetAutoTier are…
- CreateSessionFSProvider is required in session config when…
- GitHubToken and UseLoggedInUser cannot be used with…
- Cli reader is required
- CliHash must be a SHA-256 hash
AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09).
Data as JSON: /api/errors/3d37de9e4516abc0.
Report an issue: GitHub.
Appendix: source
Thrown at go/client.go:839
}
func hasManagedSettings(enableManagedSettings *bool, managedSettings *ManagedSettings) bool {
return (enableManagedSettings != nil && *enableManagedSettings) || managedSettings != nil
}
func validateAskUserVariant(variant AskUserVariant) error {
if variant != "" && variant != AskUserVariantLegacy && variant != AskUserVariantElicitation {
return fmt.Errorf("invalid AskUserVariant %q: expected %q, %q, or unset", variant, AskUserVariantLegacy, AskUserVariantElicitation)
}
return nil
}
func (c *Client) CreateSession(ctx context.Context, config *SessionConfig) (*Session, error) {
if config == nil {
config = &SessionConfig{}
}
if config.GitHubToken != "" && config.GitHubTokenProvider != nil {
return nil, fmt.Errorf("GitHubToken and GitHubTokenProvider cannot be used together")
}
if err := validateAskUserVariant(config.AskUserVariant); err != nil {
return nil, err
}
if err := c.ensureConnected(ctx); err != nil {
return nil, err
}
c.applyConfigDefaultsForMode(config)
registrationID := c.registerGitHubTokenProvider(config.GitHubTokenProvider)
registrationTransferred := false
defer func() {
if !registrationTransferred {
c.unregisterGitHubTokenProvider(registrationID)
}
}()View on GitHub (pinned to cd8cf15dc3)