From 8741d33a9b7057e0cdf0b602022d99daeda2136d Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:31:15 +0000 Subject: [PATCH 1/4] fix(proxy): default max_idle_connection_lifetime to prevent stale PostgreSQL connections Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/_types.py | 10 ++ litellm/proxy/db/db_url_settings.py | 1 + litellm/proxy/proxy_cli.py | 12 ++ .../proxy/db/test_db_url_settings.py | 9 ++ tests/test_litellm/proxy/test_proxy_cli.py | 116 ++++++++++++++++++ 5 files changed, 148 insertions(+) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index ed49ca2caa9..0e3d7bc82b9 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2415,6 +2415,16 @@ class ConfigGeneralSettings(LiteLLMPydanticObjectBase): database_connection_timeout: float | None = Field( 60, description="default timeout for a connection to the database" ) + database_connection_idle_lifetime: float | None = Field( + 60, + description=( + "Prisma `max_idle_connection_lifetime` URL param (seconds). Connections " + "idle longer than this are closed by the pool before a managed database " + "(RDS, Cloud SQL, Azure) silently drops them, preventing intermittent " + "`Error { kind: Closed }` failures. Set to null to fall back to " + "Prisma's built-in default (300s)." + ), + ) database_connect_timeout: float | None = Field( None, description=( diff --git a/litellm/proxy/db/db_url_settings.py b/litellm/proxy/db/db_url_settings.py index 1a39016b3a3..d9ad36cd27d 100644 --- a/litellm/proxy/db/db_url_settings.py +++ b/litellm/proxy/db/db_url_settings.py @@ -82,6 +82,7 @@ CONNECTION_PARAM_KEYS: Final[frozenset[str]] = frozenset( "pool_timeout", "connect_timeout", "socket_timeout", + "max_idle_connection_lifetime", "pgbouncer", } ) diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index 8ac63ba25c9..75d11dd9a17 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -56,6 +56,7 @@ telemetry: Final = None class LiteLLMDatabaseConnectionPool(Enum): database_connection_pool_limit = 10 database_connection_pool_timeout = 60 + database_connection_idle_lifetime = 60 def _build_db_connection_url_params( @@ -63,6 +64,7 @@ def _build_db_connection_url_params( pool_timeout: float | None, connect_timeout: float | None = None, socket_timeout: float | None = None, + idle_connection_lifetime: float | None = None, disable_prepared_statements: bool = False, extra_params: dict | None = None, ) -> dict: @@ -86,6 +88,8 @@ def _build_db_connection_url_params( params["connect_timeout"] = connect_timeout if socket_timeout is not None: params["socket_timeout"] = socket_timeout + if idle_connection_lifetime is not None: + params["max_idle_connection_lifetime"] = idle_connection_lifetime if disable_prepared_statements: params["pgbouncer"] = "true" if extra_params: @@ -1081,6 +1085,9 @@ def run_server( db_connection_timeout: int | float | None = 60 db_connect_timeout: int | float | None = None db_socket_timeout: int | float | None = None + db_connection_idle_lifetime: int | float | None = ( + LiteLLMDatabaseConnectionPool.database_connection_idle_lifetime.value + ) db_disable_prepared_statements: bool = False db_extra_connection_params: dict | None = None db_statement_timeout: float | None = None @@ -1183,6 +1190,10 @@ def run_server( db_connection_timeout = LiteLLMDatabaseConnectionPool.database_connection_pool_timeout.value db_connect_timeout = general_settings.get("database_connect_timeout") db_socket_timeout = general_settings.get("database_socket_timeout") + db_connection_idle_lifetime = general_settings.get( + "database_connection_idle_lifetime", + LiteLLMDatabaseConnectionPool.database_connection_idle_lifetime.value, + ) _disable_prepared_statements: Final = general_settings.get("database_disable_prepared_statements", False) if isinstance(_disable_prepared_statements, str): from litellm.secret_managers.main import str_to_bool @@ -1250,6 +1261,7 @@ def run_server( pool_timeout=db_connection_timeout, connect_timeout=db_connect_timeout, socket_timeout=db_socket_timeout, + idle_connection_lifetime=db_connection_idle_lifetime, disable_prepared_statements=db_disable_prepared_statements, extra_params=db_extra_connection_params, ) diff --git a/tests/test_litellm/proxy/db/test_db_url_settings.py b/tests/test_litellm/proxy/db/test_db_url_settings.py index 2552e52fb77..870504a008e 100644 --- a/tests/test_litellm/proxy/db/test_db_url_settings.py +++ b/tests/test_litellm/proxy/db/test_db_url_settings.py @@ -739,3 +739,12 @@ def test_unsupported_db_scheme_message_names_var_and_scheme(): assert "DIRECT_URL" in msg assert "sqlite" in msg assert "postgresql://" in msg + + +def test_reader_shareable_params_includes_idle_lifetime(): + from litellm.proxy.db.db_url_settings import reader_shareable_params + + shared = reader_shareable_params( + {"max_idle_connection_lifetime": 60, "schema": "other", "connection_limit": 10} + ) + assert shared == {"max_idle_connection_lifetime": 60, "connection_limit": 10} diff --git a/tests/test_litellm/proxy/test_proxy_cli.py b/tests/test_litellm/proxy/test_proxy_cli.py index 6ea6f208bb5..b77824b5895 100644 --- a/tests/test_litellm/proxy/test_proxy_cli.py +++ b/tests/test_litellm/proxy/test_proxy_cli.py @@ -879,6 +879,122 @@ class TestProxyInitializationHelpers: assert appended_params["pgbouncer"] == "true" assert appended_params["statement_cache_size"] == 0 + def test_build_db_connection_url_params_includes_idle_lifetime(self): + from litellm.proxy.proxy_cli import _build_db_connection_url_params + + params = _build_db_connection_url_params( + connection_limit=10, + pool_timeout=60, + idle_connection_lifetime=60, + ) + assert params["max_idle_connection_lifetime"] == 60 + + def test_build_db_connection_url_params_omits_none_idle_lifetime(self): + from litellm.proxy.proxy_cli import _build_db_connection_url_params + + params = _build_db_connection_url_params( + connection_limit=10, + pool_timeout=60, + idle_connection_lifetime=None, + ) + assert "max_idle_connection_lifetime" not in params + + def test_build_db_connection_url_params_extra_overrides_idle_lifetime(self): + from litellm.proxy.proxy_cli import _build_db_connection_url_params + + params = _build_db_connection_url_params( + connection_limit=10, + pool_timeout=60, + idle_connection_lifetime=60, + extra_params={"max_idle_connection_lifetime": 300}, + ) + assert params["max_idle_connection_lifetime"] == 300 + + @pytest.mark.parametrize( + "general_settings, expected_idle_lifetime", + [ + ({}, 60), + ({"database_connection_idle_lifetime": 30}, 30), + ], + ) + @patch("subprocess.run") + @patch("atexit.register") + @patch("litellm.proxy.db.prisma_client.PrismaManager.setup_database") + @patch( + "litellm.proxy.db.prisma_client.should_update_prisma_schema", return_value=False + ) + def test_db_connection_idle_lifetime_forwarded_to_url( + self, + mock_should_update, + mock_setup_db, + mock_atexit_register, + mock_subprocess_run, + general_settings, + expected_idle_lifetime, + ): + from click.testing import CliRunner + + from litellm.proxy.proxy_cli import run_server + + runner = CliRunner() + mock_subprocess_run.return_value = MagicMock(returncode=0) + + mock_proxy_module = MagicMock( + app=MagicMock(), + ProxyConfig=MagicMock(), + KeyManagementSettings=MagicMock(), + save_worker_config=MagicMock(), + ) + mock_proxy_module.ProxyConfig.return_value.get_config = AsyncMock( + return_value={ + "general_settings": { + "database_url": "postgresql://test:test@localhost:5432/test", + **general_settings, + } + } + ) + + clean_env = { + k: v + for k, v in os.environ.items() + if k not in ("DATABASE_URL", "DIRECT_URL") + } + + with ( + patch.dict(os.environ, clean_env, clear=True), + patch.dict( + "sys.modules", + { + "proxy_server": mock_proxy_module, + "litellm.proxy.proxy_server": mock_proxy_module, + }, + ), + patch( + "litellm.proxy.proxy_cli.ProxyInitializationHelpers._get_default_unvicorn_init_args" + ) as mock_get_args, + patch( + "litellm.proxy.proxy_cli.append_query_params", + side_effect=lambda url, params: str(url), + ) as mock_append_query_params, + ): + mock_get_args.return_value = { + "app": "litellm.proxy.proxy_server:app", + "host": "localhost", + "port": 8000, + } + + result = runner.invoke( + run_server, + ["--local", "--config", "test-config.yaml", "--skip_server_startup"], + ) + + assert ( + result.exit_code == 0 + ), f"exit_code={result.exit_code}, output={result.output}" + mock_append_query_params.assert_called() + appended_params = mock_append_query_params.call_args.args[1] + assert appended_params["max_idle_connection_lifetime"] == expected_idle_lifetime + def test_build_db_connection_url_params_disable_prepared_statements(self): from litellm.proxy.proxy_cli import _build_db_connection_url_params From e4e09867f07fe7d26e506841d00bd8c5346e6001 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:52:51 +0000 Subject: [PATCH 2/4] chore: suppress budget-gate findings, sync generated UI schema Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/proxy_cli.py | 4 ++-- tests/test_litellm/proxy/test_proxy_cli.py | 8 ++++---- ui/litellm-dashboard/src/lib/http/schema.d.ts | 6 ++++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index 75d11dd9a17..eb40d7c2d0e 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -1085,7 +1085,7 @@ def run_server( db_connection_timeout: int | float | None = 60 db_connect_timeout: int | float | None = None db_socket_timeout: int | float | None = None - db_connection_idle_lifetime: int | float | None = ( + db_connection_idle_lifetime: int | float | None = ( # rebind-ok: overwritten from general_settings when a config is provided LiteLLMDatabaseConnectionPool.database_connection_idle_lifetime.value ) db_disable_prepared_statements: bool = False @@ -1190,7 +1190,7 @@ def run_server( db_connection_timeout = LiteLLMDatabaseConnectionPool.database_connection_pool_timeout.value db_connect_timeout = general_settings.get("database_connect_timeout") db_socket_timeout = general_settings.get("database_socket_timeout") - db_connection_idle_lifetime = general_settings.get( + db_connection_idle_lifetime = general_settings.get( # rebind-ok: default declared above for the no-config path "database_connection_idle_lifetime", LiteLLMDatabaseConnectionPool.database_connection_idle_lifetime.value, ) diff --git a/tests/test_litellm/proxy/test_proxy_cli.py b/tests/test_litellm/proxy/test_proxy_cli.py index b77824b5895..9f4ec20ce16 100644 --- a/tests/test_litellm/proxy/test_proxy_cli.py +++ b/tests/test_litellm/proxy/test_proxy_cli.py @@ -919,8 +919,8 @@ class TestProxyInitializationHelpers: ) @patch("subprocess.run") @patch("atexit.register") - @patch("litellm.proxy.db.prisma_client.PrismaManager.setup_database") - @patch( + @patch("litellm.proxy.db.prisma_client.PrismaManager.setup_database") # test-quality-ok: CLI boot test cannot run real prisma migrations, same as sibling boot tests + @patch( # test-quality-ok: CLI boot test cannot run real prisma migrations, same as sibling boot tests "litellm.proxy.db.prisma_client.should_update_prisma_schema", return_value=False ) def test_db_connection_idle_lifetime_forwarded_to_url( @@ -969,10 +969,10 @@ class TestProxyInitializationHelpers: "litellm.proxy.proxy_server": mock_proxy_module, }, ), - patch( + patch( # test-quality-ok: keeps the boot test from binding a real port, same as sibling boot tests "litellm.proxy.proxy_cli.ProxyInitializationHelpers._get_default_unvicorn_init_args" ) as mock_get_args, - patch( + patch( # test-quality-ok: capture point for the assembled URL params, same as sibling boot tests "litellm.proxy.proxy_cli.append_query_params", side_effect=lambda url, params: str(url), ) as mock_append_query_params, diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 405ec9a01bf..e2103251997 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -24930,6 +24930,12 @@ export interface components { * @description Prisma `connect_timeout` URL param (seconds). Bounds how long the engine waits to establish a new connection before failing. Defaults to Prisma's built-in value when unset. */ database_connect_timeout?: number | null; + /** + * Database Connection Idle Lifetime + * @description Prisma `max_idle_connection_lifetime` URL param (seconds). Connections idle longer than this are closed by the pool before a managed database (RDS, Cloud SQL, Azure) silently drops them, preventing intermittent `Error { kind: Closed }` failures. Set to null to fall back to Prisma's built-in default (300s). + * @default 60 + */ + database_connection_idle_lifetime: number | null; /** * Database Connection Pool Limit * @description default connection pool for prisma client connecting to postgres db From e12a4243b658e31684983884c1f5cd4cce2d539e Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 01:13:28 +0000 Subject: [PATCH 3/4] fix(proxy): keep operator-pinned max_idle_connection_lifetime URL values over the default Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/proxy_cli.py | 28 +++++---- tests/test_litellm/proxy/test_proxy_cli.py | 68 +++++++++------------- 2 files changed, 44 insertions(+), 52 deletions(-) diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index eb40d7c2d0e..d42bf9715e7 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -7,8 +7,9 @@ import re import subprocess import sys import urllib.parse as urlparse -from collections.abc import Iterable +from collections.abc import Iterable, Mapping from pathlib import Path +from types import MappingProxyType from typing import TYPE_CHECKING, Any, Final import click @@ -64,7 +65,6 @@ def _build_db_connection_url_params( pool_timeout: float | None, connect_timeout: float | None = None, socket_timeout: float | None = None, - idle_connection_lifetime: float | None = None, disable_prepared_statements: bool = False, extra_params: dict | None = None, ) -> dict: @@ -88,8 +88,6 @@ def _build_db_connection_url_params( params["connect_timeout"] = connect_timeout if socket_timeout is not None: params["socket_timeout"] = socket_timeout - if idle_connection_lifetime is not None: - params["max_idle_connection_lifetime"] = idle_connection_lifetime if disable_prepared_statements: params["pgbouncer"] = "true" if extra_params: @@ -1085,7 +1083,9 @@ def run_server( db_connection_timeout: int | float | None = 60 db_connect_timeout: int | float | None = None db_socket_timeout: int | float | None = None - db_connection_idle_lifetime: int | float | None = ( # rebind-ok: overwritten from general_settings when a config is provided + db_connection_idle_lifetime: ( + int | float | None + ) = ( # rebind-ok: overwritten from general_settings when a config is provided LiteLLMDatabaseConnectionPool.database_connection_idle_lifetime.value ) db_disable_prepared_statements: bool = False @@ -1190,7 +1190,7 @@ def run_server( db_connection_timeout = LiteLLMDatabaseConnectionPool.database_connection_pool_timeout.value db_connect_timeout = general_settings.get("database_connect_timeout") db_socket_timeout = general_settings.get("database_socket_timeout") - db_connection_idle_lifetime = general_settings.get( # rebind-ok: default declared above for the no-config path + db_connection_idle_lifetime = general_settings.get( # rebind-ok: default set for the no-config path "database_connection_idle_lifetime", LiteLLMDatabaseConnectionPool.database_connection_idle_lifetime.value, ) @@ -1261,10 +1261,18 @@ def run_server( pool_timeout=db_connection_timeout, connect_timeout=db_connect_timeout, socket_timeout=db_socket_timeout, - idle_connection_lifetime=db_connection_idle_lifetime, disable_prepared_statements=db_disable_prepared_statements, extra_params=db_extra_connection_params, ) + # The idle lifetime is applied add-if-missing so a value the operator + # pinned on the URL itself keeps winning over the built-in default. + idle_lifetime_params: Final[Mapping[str, int | float]] = MappingProxyType( + { + "max_idle_connection_lifetime": lifetime + for lifetime in (db_connection_idle_lifetime,) + if lifetime is not None + } + ) if os.getenv("DATABASE_URL", None) is not None: database_url = get_secret("DATABASE_URL", default_value=None) resolved_url: Final[str | None] = str(database_url) if database_url else None @@ -1282,11 +1290,11 @@ def run_server( writer_url, connection_url_params, ) - os.environ["DATABASE_URL"] = modified_url + os.environ["DATABASE_URL"] = add_missing_query_params(modified_url, idle_lifetime_params) if os.getenv("DIRECT_URL", None) is not None: database_url = os.getenv("DIRECT_URL") modified_url = append_query_params(database_url, connection_url_params) - os.environ["DIRECT_URL"] = modified_url + os.environ["DIRECT_URL"] = add_missing_query_params(modified_url, idle_lifetime_params) # The reader pool is a real pool against the same configured cap, so it # gets the allowlisted pool params. Schema-affecting ones, including any # the operator smuggled in through database_extra_connection_params, stay @@ -1303,7 +1311,7 @@ def run_server( _with_query_value(read_replica_url, "options", reader_options) if reader_options else read_replica_url, - reader_shareable_params(connection_url_params), + reader_shareable_params(MappingProxyType({**idle_lifetime_params, **connection_url_params})), ) subprocess.run(["prisma"], capture_output=True) is_prisma_runnable = True diff --git a/tests/test_litellm/proxy/test_proxy_cli.py b/tests/test_litellm/proxy/test_proxy_cli.py index 9f4ec20ce16..0ad9049b228 100644 --- a/tests/test_litellm/proxy/test_proxy_cli.py +++ b/tests/test_litellm/proxy/test_proxy_cli.py @@ -879,42 +879,25 @@ class TestProxyInitializationHelpers: assert appended_params["pgbouncer"] == "true" assert appended_params["statement_cache_size"] == 0 - def test_build_db_connection_url_params_includes_idle_lifetime(self): - from litellm.proxy.proxy_cli import _build_db_connection_url_params - - params = _build_db_connection_url_params( - connection_limit=10, - pool_timeout=60, - idle_connection_lifetime=60, - ) - assert params["max_idle_connection_lifetime"] == 60 - - def test_build_db_connection_url_params_omits_none_idle_lifetime(self): - from litellm.proxy.proxy_cli import _build_db_connection_url_params - - params = _build_db_connection_url_params( - connection_limit=10, - pool_timeout=60, - idle_connection_lifetime=None, - ) - assert "max_idle_connection_lifetime" not in params - - def test_build_db_connection_url_params_extra_overrides_idle_lifetime(self): - from litellm.proxy.proxy_cli import _build_db_connection_url_params - - params = _build_db_connection_url_params( - connection_limit=10, - pool_timeout=60, - idle_connection_lifetime=60, - extra_params={"max_idle_connection_lifetime": 300}, - ) - assert params["max_idle_connection_lifetime"] == 300 - @pytest.mark.parametrize( - "general_settings, expected_idle_lifetime", + "general_settings, database_url, expected_idle_lifetime", [ - ({}, 60), - ({"database_connection_idle_lifetime": 30}, 30), + ({}, "postgresql://test:test@localhost:5432/test", "60"), + ( + {"database_connection_idle_lifetime": 30}, + "postgresql://test:test@localhost:5432/test", + "30", + ), + ( + {"database_connection_idle_lifetime": None}, + "postgresql://test:test@localhost:5432/test", + None, + ), + ( + {}, + "postgresql://test:test@localhost:5432/test?max_idle_connection_lifetime=300", + "300", + ), ], ) @patch("subprocess.run") @@ -930,6 +913,7 @@ class TestProxyInitializationHelpers: mock_atexit_register, mock_subprocess_run, general_settings, + database_url, expected_idle_lifetime, ): from click.testing import CliRunner @@ -948,7 +932,7 @@ class TestProxyInitializationHelpers: mock_proxy_module.ProxyConfig.return_value.get_config = AsyncMock( return_value={ "general_settings": { - "database_url": "postgresql://test:test@localhost:5432/test", + "database_url": database_url, **general_settings, } } @@ -972,10 +956,6 @@ class TestProxyInitializationHelpers: patch( # test-quality-ok: keeps the boot test from binding a real port, same as sibling boot tests "litellm.proxy.proxy_cli.ProxyInitializationHelpers._get_default_unvicorn_init_args" ) as mock_get_args, - patch( # test-quality-ok: capture point for the assembled URL params, same as sibling boot tests - "litellm.proxy.proxy_cli.append_query_params", - side_effect=lambda url, params: str(url), - ) as mock_append_query_params, ): mock_get_args.return_value = { "app": "litellm.proxy.proxy_server:app", @@ -991,9 +971,13 @@ class TestProxyInitializationHelpers: assert ( result.exit_code == 0 ), f"exit_code={result.exit_code}, output={result.output}" - mock_append_query_params.assert_called() - appended_params = mock_append_query_params.call_args.args[1] - assert appended_params["max_idle_connection_lifetime"] == expected_idle_lifetime + final_query = dict( + urlparse.parse_qsl(urlparse.urlparse(os.environ["DATABASE_URL"]).query) + ) + if expected_idle_lifetime is None: + assert "max_idle_connection_lifetime" not in final_query + else: + assert final_query["max_idle_connection_lifetime"] == expected_idle_lifetime def test_build_db_connection_url_params_disable_prepared_statements(self): from litellm.proxy.proxy_cli import _build_db_connection_url_params From 122cc0f3a5a05ff12dfebf31eb9b7cee419e5f65 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 01:21:10 +0000 Subject: [PATCH 4/4] chore(proxy): resync generated OpenAPI snapshot and dashboard schema Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/proxy/_lazy_openapi_snapshot.json | 12 ++++++++++++ ui/litellm-dashboard/src/lib/http/schema.d.ts | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/litellm/proxy/_lazy_openapi_snapshot.json b/litellm/proxy/_lazy_openapi_snapshot.json index 0930febc449..4ccfde18d36 100644 --- a/litellm/proxy/_lazy_openapi_snapshot.json +++ b/litellm/proxy/_lazy_openapi_snapshot.json @@ -11364,6 +11364,18 @@ "description": "Path to a JSON file containing ad-hoc recognizers for Presidio", "title": "Presidio Ad Hoc Recognizers" }, + "presidio_analyze_chunk_size_bytes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Maximum UTF-8 bytes of text sent in a single Presidio /analyze call. Longer texts are split into overlapping chunks of at most this size and the merged results are remapped onto the original text. Defaults to 500000; set it below your analyzer deployment's request body limit, leaving headroom for the rest of the analyze payload.", + "title": "Presidio Analyze Chunk Size Bytes" + }, "presidio_analyzer_api_base": { "anyOf": [ { diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index c727cf03df5..c8e5e6779de 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -29943,6 +29943,11 @@ export interface components { * @description Path to a JSON file containing ad-hoc recognizers for Presidio */ presidio_ad_hoc_recognizers?: string | null; + /** + * Presidio Analyze Chunk Size Bytes + * @description Maximum UTF-8 bytes of text sent in a single Presidio /analyze call. Longer texts are split into overlapping chunks of at most this size and the merged results are remapped onto the original text. Defaults to 500000; set it below your analyzer deployment's request body limit, leaving headroom for the rest of the analyze payload. + */ + presidio_analyze_chunk_size_bytes?: number | null; /** * Presidio Analyzer Api Base * @description Base URL for the Presidio analyzer API