From 52106d95d3a7cb089917693c51d3f58867b5a0c5 Mon Sep 17 00:00:00 2001 From: Omer Tuchfeld Date: Thu, 28 Aug 2025 17:07:18 +0200 Subject: [PATCH] fix(env): env var replacement preserve types (#3270) # What does this PR do? During env var replacement, we're implicitly converting all config types to their apparent types (e.g., "true" to True, "123" to 123). This may be arguably useful for when doing an env var substitution, as those are always strings, but we should definitely avoid touching config values that have explicit types and are uninvolved in env var substitution. ## Test Plan Unit --- llama_stack/core/stack.py | 5 ++++- tests/unit/server/test_replace_env_vars.py | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/llama_stack/core/stack.py b/llama_stack/core/stack.py index 87a3978c1..f734d0285 100644 --- a/llama_stack/core/stack.py +++ b/llama_stack/core/stack.py @@ -225,7 +225,10 @@ def replace_env_vars(config: Any, path: str = "") -> Any: try: result = re.sub(pattern, get_env_var, config) - return _convert_string_to_proper_type(result) + # Only apply type conversion if substitution actually happened + if result != config: + return _convert_string_to_proper_type(result) + return result except EnvVarError as e: raise EnvVarError(e.var_name, e.path) from None diff --git a/tests/unit/server/test_replace_env_vars.py b/tests/unit/server/test_replace_env_vars.py index 0dda682c0..14b3b7231 100644 --- a/tests/unit/server/test_replace_env_vars.py +++ b/tests/unit/server/test_replace_env_vars.py @@ -88,3 +88,10 @@ def test_nested_structures(setup_env_vars): } expected = {"key1": "test_value", "key2": ["default", "conditional"], "key3": {"nested": None}} assert replace_env_vars(data) == expected + + +def test_explicit_strings_preserved(setup_env_vars): + # Explicit strings that look like numbers/booleans should remain strings + data = {"port": "8080", "enabled": "true", "count": "123", "ratio": "3.14"} + expected = {"port": "8080", "enabled": "true", "count": "123", "ratio": "3.14"} + assert replace_env_vars(data) == expected