{"record":{"id":"da5c21315bef44fc","repo":"BerriAI/litellm","slug":"vigil-guard-backend-unreachable-request-blocked-b","errorCode":null,"errorMessage":"Vigil Guard backend unreachable; request blocked by fail_closed policy.","messagePattern":"Vigil Guard backend unreachable; request blocked by fail_closed policy\\.","errorType":"exception","errorClass":"GuardrailRaisedException","httpStatus":null,"severity":"error","filePath":"litellm/proxy/guardrails/guardrail_hooks/vigil_guard/vigil_guard.py","lineNumber":265,"sourceCode":"        final_texts: list[Any],\n        final_tool_calls: Any,\n    ) -> GenericGuardrailAPIInputs:\n        if self.unreachable_fallback == \"fail_open\":\n            verbose_proxy_logger.error(\n                \"Vigil Guard backend failure with fail_open; allowing request \"\n                \"unscanned. guardrail_name=%s source=%s error=%s\",\n                self.guardrail_name,\n                source,\n                str(exc),\n            )\n            return self._build_output(inputs, final_texts, final_tool_calls)\n        verbose_proxy_logger.error(\n            \"Vigil Guard backend failure with fail_closed; blocking request. guardrail_name=%s source=%s error=%s\",\n            self.guardrail_name,\n            source,\n            str(exc),\n        )\n        raise GuardrailRaisedException(\n            guardrail_name=self.guardrail_name,\n            message=\"Vigil Guard backend unreachable; request blocked by fail_closed policy.\",\n            should_wrap_with_default_message=False,\n        ) from exc\n\n    @staticmethod\n    def _build_output(\n        inputs: GenericGuardrailAPIInputs,\n        final_texts: list[Any],\n        final_tool_calls: Any,\n    ) -> GenericGuardrailAPIInputs:\n        # When nothing was changed, return the input shape verbatim so the guardrail\n        # logs \"allow\" rather than \"mask\". When a text or a tool-call argument was\n        # changed (sanitized), return only the remap-relevant keys and drop\n        # structured_messages so a stale, unsanitized payload cannot reach the model.\n        texts_changed: Final = final_texts != (inputs.get(\"texts\") or [])\n        tool_calls_changed: Final = final_tool_calls != inputs.get(\"tool_calls\")\n        if not texts_changed and not tool_calls_changed:","sourceCodeStart":247,"sourceCodeEnd":283,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/guardrails/guardrail_hooks/vigil_guard/vigil_guard.py#L247-L283","documentation":"Error \"Vigil Guard backend unreachable; request blocked by fail_closed policy.\" thrown in BerriAI/litellm.","triggerScenarios":"Thrown at litellm/proxy/guardrails/guardrail_hooks/vigil_guard/vigil_guard.py:265 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Restore connectivity to the Vigil Guard backend.","If downtime should not block traffic, change the fail_closed policy to fail open."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}