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
- Log in through the GitButler desktop app so the access token is stored in the secret store.
- Or add your own Anthropic API key in GitButler settings (OwnAnthropicKey path).
- Or export ANTHROPIC_API_KEY so the env-var credential path succeeds.
- 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
- Ensure a desktop-app login happened before using proxied providers in CLI contexts.
- Pass preferred_creds = None in library code so the provider can fall back instead of hard-failing.
- Surface 'log in or set ANTHROPIC_API_KEY' guidance in UX when this error appears.
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
- No GitButler token available. Log-in to use the GitButler Op
- No Anthropic own key configured. Add this through the GitBut
- Environment variable ANTHROPIC_API_KEY is not set
- Invalid UTF-8 in ANTHROPIC_API_KEY
- No OpenAI own key configured. Add this through the GitButler
AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20).
Data as JSON: /api/errors/946d05c53e607687.
Report an issue: GitHub.