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

  1. Remove GitHubToken and keep only GitHubTokenProvider, or vice versa.
  2. Audit config-merging code so only one credential source survives the merge.
  3. 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

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


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)