{"record":{"id":"c206c8fcb9935725","repo":"BerriAI/litellm","slug":"streaming-sampling-rate-must-be-1-got-streami","errorCode":null,"errorMessage":"streaming_sampling_rate must be >= 1 (got {streaming_sampling_rate})","messagePattern":"streaming_sampling_rate must be >= 1 \\(got (.+?)\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/proxy/guardrails/guardrail_hooks/generic_guardrail_api/generic_guardrail_api.py","lineNumber":222,"sourceCode":"        if not base_url.endswith(\"/beta/litellm_basic_guardrail_api\"):\n            base_url = base_url.rstrip(\"/\")\n            self.api_base = f\"{base_url}/beta/litellm_basic_guardrail_api\"\n        else:\n            self.api_base = base_url\n\n        self.additional_provider_specific_params = additional_provider_specific_params or {}\n\n        self.unreachable_fallback: Literal[\"fail_closed\", \"fail_open\"] = unreachable_fallback\n\n        self.fail_on_error: bool = True if fail_on_error is None else fail_on_error\n\n        # Read by UnifiedLLMGuardrails.async_post_call_streaming_iterator_hook\n        # via getattr(guardrail_to_apply, \"streaming_*\", default).\n        self.streaming_end_of_stream_only: bool = (\n            False if streaming_end_of_stream_only is None else streaming_end_of_stream_only\n        )\n        if streaming_sampling_rate is not None and streaming_sampling_rate < 1:\n            raise ValueError(f\"streaming_sampling_rate must be >= 1 (got {streaming_sampling_rate})\")\n        self.streaming_sampling_rate: int = 5 if streaming_sampling_rate is None else streaming_sampling_rate\n\n        # Read by UnifiedLLMGuardrails.async_post_call_streaming_iterator_hook.\n        # \"block_only\" (default) drops text rewrites on the streaming path;\n        # \"incremental_diff\" emits them as synthetic deltas.\n        self.streaming_transform_mode: Literal[\"block_only\", \"incremental_diff\"] = (\n            \"block_only\" if streaming_transform_mode is None else streaming_transform_mode\n        )\n\n        # Set supported event hooks\n        kwargs.setdefault(\"supported_event_hooks\", list(self.get_supported_event_hooks()))\n\n        super().__init__(**kwargs)\n\n        verbose_proxy_logger.debug(\"Generic Guardrail API initialized with api_base: %s\", self.api_base)\n\n    def _extract_user_api_key_metadata(self, request_data: dict) -> GenericGuardrailAPIMetadata:\n        \"\"\"","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/guardrails/guardrail_hooks/generic_guardrail_api/generic_guardrail_api.py#L204-L240","documentation":"ValueError raised in GenericGuardrailAPI.__init__ when streaming_sampling_rate is provided with a value below 1. The parameter controls how often the streaming path samples chunks (read by UnifiedLLMGuardrails.async_post_call_streaming_iterator_hook via getattr); values < 1 are nonsensical (they would sample less than every chunk), so init rejects them. Default is 5 when unset.","triggerScenarios":"Config such as litellm_params: { guardrail: generic_guardrail_api, streaming_sampling_rate: 0 } or 0.5; passing 0 intending 'scan everything' when 1 is the minimum.","commonSituations":"Copied YAML from another guardrail where 0 was allowed; misunderstanding the parameter as a probability instead of a chunk interval; config templating inserting 0 as a placeholder.","solutions":["Set streaming_sampling_rate to 1 (scan every chunk) or higher, or remove it to accept the default of 5.","Re-run proxy startup / config validation after the change.","Grep your config templates for streaming_sampling_rate placeholders that default to 0."],"exampleFix":"# before\nlitellm_params:\n  guardrail: generic_guardrail_api\n  api_base: https://guardrail.internal\n  streaming_sampling_rate: 0\n\n# after\nlitellm_params:\n  guardrail: generic_guardrail_api\n  api_base: https://guardrail.internal\n  streaming_sampling_rate: 1","handlingStrategy":"validation","validationCode":"if (rate := cfg.litellm_params.get('streaming_sampling_rate')) is not None and rate < 1:\n    raise SystemExit(f'invalid streaming_sampling_rate={rate}; must be >= 1')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat streaming_sampling_rate as a chunk interval (>=1), not a probability.","Use config schema validation in CI to catch out-of-range numeric params.","Omit the parameter to accept the default of 5 when unsure."],"tags":["generic-guardrail","guardrail","streaming","config-validation","invalid-parameter"],"backgroundTag":"config-validation-failed","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","schemaVersion":2},"datasetVersion":"2026-08-22T04:17:13.399Z"}