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