BerriAI/litellm · error · GuardrailRaisedException

Vigil Guard backend unreachable; request blocked by fail_clo

Error message

Vigil Guard backend unreachable; request blocked by fail_closed policy.

What it means

Error "Vigil Guard backend unreachable; request blocked by fail_closed policy." thrown in BerriAI/litellm.

Source

Thrown at litellm/proxy/guardrails/guardrail_hooks/vigil_guard/vigil_guard.py:265

        final_texts: list[Any],
        final_tool_calls: Any,
    ) -> GenericGuardrailAPIInputs:
        if self.unreachable_fallback == "fail_open":
            verbose_proxy_logger.error(
                "Vigil Guard backend failure with fail_open; allowing request "
                "unscanned. guardrail_name=%s source=%s error=%s",
                self.guardrail_name,
                source,
                str(exc),
            )
            return self._build_output(inputs, final_texts, final_tool_calls)
        verbose_proxy_logger.error(
            "Vigil Guard backend failure with fail_closed; blocking request. guardrail_name=%s source=%s error=%s",
            self.guardrail_name,
            source,
            str(exc),
        )
        raise GuardrailRaisedException(
            guardrail_name=self.guardrail_name,
            message="Vigil Guard backend unreachable; request blocked by fail_closed policy.",
            should_wrap_with_default_message=False,
        ) from exc

    @staticmethod
    def _build_output(
        inputs: GenericGuardrailAPIInputs,
        final_texts: list[Any],
        final_tool_calls: Any,
    ) -> GenericGuardrailAPIInputs:
        # When nothing was changed, return the input shape verbatim so the guardrail
        # logs "allow" rather than "mask". When a text or a tool-call argument was
        # changed (sanitized), return only the remap-relevant keys and drop
        # structured_messages so a stale, unsanitized payload cannot reach the model.
        texts_changed: Final = final_texts != (inputs.get("texts") or [])
        tool_calls_changed: Final = final_tool_calls != inputs.get("tool_calls")
        if not texts_changed and not tool_calls_changed:

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Restore connectivity to the Vigil Guard backend.
  2. If downtime should not block traffic, change the fail_closed policy to fail open.

When it happens

Trigger: Thrown at litellm/proxy/guardrails/guardrail_hooks/vigil_guard/vigil_guard.py:265 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/da5c21315bef44fc. Report an issue: GitHub.