ADR-010: LLM Error Message Sanitization Before Browser Output
Status: Accepted
Date: 2026-03-15
Context
When the LLM API call or MCP tool execution fails, the exception message may contain sensitive data from the provider stack: Bearer tokens, API keys, internal URLs, or credential fragments embedded in HTTP error responses. If forwarded to the browser as-is, these leak credentials to the end user (and potentially to browser logs, network proxies, or JavaScript error trackers).
Alternatives considered:
- Generic error messages only ("An error occurred"): Safe, but provides no useful diagnostic information to the user or administrator.
- Server-side logging only, generic client message: Good for production, but loses context for debugging.
- Sanitize before sending: Strip known credential patterns and truncate, then forward the cleaned message to the client.
Decision
All exception messages that originate from LLM or MCP calls are passed through
ErrorMessageSanitizer::sanitize() before being stored in the database or
returned to the browser. The sanitizer:
- Redacts
Bearer <token>patterns. - Redacts strings matching common API key patterns (
sk-...,key-...,api-key-...). - Replaces URLs with
[URL]. - Truncates to 500 characters.
Consequences
- Credential leaks via error messages are prevented at the boundary between the processing layer and the database/browser.
- Sanitized messages still carry enough context (HTTP status codes, provider error codes) for debugging.
- The sanitizer is a simple utility class with no dependencies, independently testable.
- Patterns may need updating as provider error formats evolve.