gitbutlerapp/gitbutler · error

No GitButler token available. Log-in to use the GitButler An

Error message

No GitButler token available. Log-in to use the GitButler Anthropic provider

What it means

Thrown by AnthropicProvider::gitbutler_proxied_creds in crates/but-llm/src/anthropic.rs when secret::retrieve(GITBUTLER_ACCESS_TOKEN_HANDLE, Namespace::BuildKind) returns None — the app's secret store has no logged-in GitButler access token. The GitButler-proxied Anthropic provider forwards requests through GitButler's servers and requires that token.

Source

Thrown at crates/but-llm/src/anthropic.rs:138

            Err(e) => {
                tracing::error!("Failed to retrieve Anthropic credentials: {}", e);
                None
            }
        }
    }

    pub fn client(&self) -> Result<AnthropicClient> {
        let credentials = &self.credentials.1;
        let kind = self.credentials.0.clone();
        AnthropicClient::new(kind, credentials)
    }

    pub fn credentials_kind(&self) -> CredentialsKind {
        self.credentials.0.clone()
    }
    fn gitbutler_proxied_creds() -> Result<(CredentialsKind, Sensitive<String>)> {
        let creds = secret::retrieve(GITBUTLER_ACCESS_TOKEN_HANDLE, secret::Namespace::BuildKind)?
            .ok_or(anyhow::anyhow!(
                "No GitButler token available. Log-in to use the GitButler Anthropic provider"
            ))?;
        Ok((CredentialsKind::GitButlerProxied, creds))
    }

    fn anthropic_own_key_creds() -> Result<(CredentialsKind, Sensitive<String>)> {
        let creds = secret::retrieve(AI_ANTHROPIC_SECRET_HANDLE, secret::Namespace::Global)?
            .ok_or(anyhow::anyhow!(
                "No Anthropic own key configured. Add this through the GitButler settings"
            ))?;
        Ok((CredentialsKind::OwnAnthropicKey, creds))
    }

    fn anthropic_env_var_creds() -> Result<(CredentialsKind, Sensitive<String>)> {
        let creds = Sensitive(
            std::env::var_os("ANTHROPIC_API_KEY")
                .ok_or(anyhow::anyhow!(
                    "Environment variable ANTHROPIC_API_KEY is not set"

View on GitHub (pinned to caf1f223d3)

Solutions

  1. Log in through the GitButler desktop app so the access token is stored in the secret store.
  2. Or add your own Anthropic API key in GitButler settings (OwnAnthropicKey path).
  3. Or export ANTHROPIC_API_KEY so the env-var credential path succeeds.
  4. If calling provider code directly, pass preferred_creds = None to let the provider try own-key then env-var instead of hard-failing on proxied creds.

Example fix

// before: force proxied creds, fails when not logged in
let provider = AnthropicProvider::with(Some(CredentialsKind::GitButlerProxied), model);

// after: let the provider fall back through proxied -> own key -> env var
let provider = AnthropicProvider::with(None, model);
Defensive patterns

Strategy: fallback

Validate before calling

// Check for a GitButler token before choosing the proxied provider
let has_token = but_secret::retrieve(GITBUTLER_ACCESS_TOKEN_HANDLE, but_secret::Namespace::BuildKind)
    .ok()
    .flatten()
    .is_some();

Type guard

fn can_use_proxied_anthropic() -> bool {
    secret::retrieve(GITBUTLER_ACCESS_TOKEN_HANDLE, secret::Namespace::BuildKind)
        .ok()
        .flatten()
        .is_some()
}

Try / catch

let provider = match AnthropicProvider::with(Some(CredentialsKind::GitButlerProxied), model) {
    Some(p) => p,
    None => AnthropicProvider::with(None, model) // falls through own-key / env-var
        .expect("no Anthropic credentials configured"),
};

Prevention

When it happens

Trigger: Constructing AnthropicProvider::with(Some(CredentialsKind::GitButlerProxied), _) without being logged in; or with preferred_creds None when neither an own key nor ANTHROPIC_API_KEY exists, so the fallback chain lands on the proxied-creds error first.

Common situations: Using but-llm in a CLI/TUI context where the desktop app never performed login; the stored token was cleared (logout, secret store reset, new keychain); CI environments with no GitButler session.

Related errors


AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20). Data as JSON: /api/errors/946d05c53e607687. Report an issue: GitHub.