affaan-m/ECC · critical · AuthenticationError
msg
Error message
msg
What it means
In AstraFlowProvider.generate()'s except block (src/llm/providers/astraflow.py:118), any exception whose string form contains '401' or 'authentication' (case-insensitive) is re-raised as AuthenticationError(msg, provider=...) with the original as __cause__. The reported message 'msg' in catalogs is the captured str(e) of the underlying SDK exception — commonly an openai.AuthenticationError with 'Error code: 401'.
Source
Thrown at src/llm/providers/astraflow.py:116
usage = None
if response.usage:
usage = {
"prompt_tokens": response.usage.prompt_tokens,
"completion_tokens": response.usage.completion_tokens,
"total_tokens": response.usage.total_tokens,
}
return LLMOutput(
content=choice.message.content or "",
tool_calls=tool_calls,
model=response.model,
usage=usage,
stop_reason=choice.finish_reason,
)
except Exception as e:
msg = str(e)
if "401" in msg or "authentication" in msg.lower():
raise AuthenticationError(msg, provider=self.provider_type) from e
if "429" in msg or "rate_limit" in msg.lower():
raise RateLimitError(msg, provider=self.provider_type) from e
if "context" in msg.lower() and "length" in msg.lower():
raise ContextLengthError(msg, provider=self.provider_type) from e
raise
def list_models(self) -> list[ModelInfo]:
return self._models.copy()
def validate_config(self) -> bool:
return bool(self.api_key)
def get_default_model(self) -> str:
return self.default_model
class AstraflowProvider(_AstraflowBaseProvider):
"""UModelVerse global endpoint using OpenAI-compatible chat completions."""View on GitHub (pinned to d8409a4b08)
Solutions
- Verify the API key is the correct, active key for this provider and set it in the environment the process actually sees.
- Print/dump the resolved config (never the key itself) and confirm the key variable name matches what the provider reads.
- Test the key directly with a minimal curl/SDK call to the provider endpoint to isolate harness vs. credential issues.
- Rotate the key if it may have leaked or been revoked.
Example fix
# before
provider = AstraFlowProvider(api_key=os.environ.get("ASTRAFLOW_API_KEY", ""))
out = provider.generate(inp) # AuthenticationError: Error code: 401 ...
# after: fail fast on missing credentials
api_key = os.environ["ASTRAFLOW_API_KEY"] # KeyError at startup, not 401 at request time
provider = AstraFlowProvider(api_key=api_key)
assert provider.validate_config() Defensive patterns
Strategy: try-catch
Validate before calling
import os
def astraflow_config_ok() -> bool:
key = os.environ.get("ASTRAFLOW_API_KEY", "")
return bool(key) and not key.startswith("sk-placeholder") # presence check only; real check is a live call Try / catch
from src.llm.core.interface import AuthenticationError
try:
out = provider.generate(inp)
except AuthenticationError:
# credentials are wrong/revoked — never retry, alert instead
alerts.critical("AstraFlow auth failed; rotate ASTRAFLOW_API_KEY")
raise Prevention
- Load the API key with a required-env lookup at startup so misconfig fails before traffic.
- validate_config() only checks presence — smoke-test credentials with one live call at boot.
- Rotate keys on schedule and keep per-environment keys separate.
When it happens
Trigger: Invalid, missing, or revoked API key; key for the wrong project/environment; Authorization header stripped by a proxy; expired token; key typo'd in the provider config (validate_config() only checks truthiness, so a wrong-but-present key passes config validation and fails here at request time).
Common situations: API key read from an env var that is unset in the deployed environment (falls back to an empty/placeholder value); rotating keys and forgetting one consumer; using a key from a different region/gateway; local .env not loaded.
Related errors
- Unauthorized
- Invalid token
- refusing to remove {project_dir}: escapes {projects_root}
- {self.__class__.__name__} must implement get_default_model
AI-assisted analysis of affaan-m/ECC@d8409a4b08 (2026-08-26).
Data as JSON: /api/errors/5339234a7f327b79.
Report an issue: GitHub.