From 9ac89fa6f94a6762730d894d883af239d8552af7 Mon Sep 17 00:00:00 2001 From: Ting Zhang <181050363+GPT-AGI@users.noreply.github.com> Date: Tue, 10 Nov 2026 03:05:42 +0800 Subject: [PATCH] fix(proxy): expand nested environment defaults in proxy config The example config falls back with ${OPENAI_API_KEY_2:-${OPENAI_API_KEY}}. The old scanner stopped at the first closing brace, so an unset secondary key stayed as the literal ${OPENAI_API_KEY} and a set key kept a trailing }. Co-authored-by: Cursor --- optillm/plugins/proxy/config.py | 36 +++++++++++++++----- tests/test_proxy_plugin.py | 59 +++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 8 deletions(-) diff --git a/optillm/plugins/proxy/config.py b/optillm/plugins/proxy/config.py index ef31cf3c..674e79d6 100644 --- a/optillm/plugins/proxy/config.py +++ b/optillm/plugins/proxy/config.py @@ -93,12 +93,32 @@ def _interpolate_env_vars(obj: Any) -> Any: Processed object with environment variables replaced """ if isinstance(obj, str): - # Pattern for ${VAR} or ${VAR:-default} - pattern = re.compile(r'\$\{([^}]+)\}') - + # Match the documented ${VAR:-${FALLBACK}} form before the + # existing simple-variable form, so the inner } does not end the + # outer match. + pattern = re.compile( + r'\$\{([^{}:]+):-\$\{([^{}:]+)\}\}|\$\{([^}]+)\}' + ) + def replacer(match): - var_expr = match.group(1) - + if match.group(1) is not None: + var_name = match.group(1).strip() + value = os.environ.get(var_name) + if value is not None: + return value + + fallback_expr = match.group(2) + fallback_name = fallback_expr.strip() + value = os.environ.get(fallback_name) + if value is None: + logger.warning( + f"Environment variable ${{{fallback_name}}} not set" + ) + return "${" + fallback_expr + "}" + return value + + var_expr = match.group(3) + # Handle ${VAR:-default} syntax if ':-' in var_expr: var_name, default = var_expr.split(':-', 1) @@ -106,13 +126,13 @@ def replacer(match): else: var_name = var_expr.strip() value = os.environ.get(var_name) - + if value is None: logger.warning(f"Environment variable ${{{var_name}}} not set") return match.group(0) # Keep original - + return value - + return pattern.sub(replacer, obj) elif isinstance(obj, dict): diff --git a/tests/test_proxy_plugin.py b/tests/test_proxy_plugin.py index e075221b..8ce23094 100644 --- a/tests/test_proxy_plugin.py +++ b/tests/test_proxy_plugin.py @@ -176,5 +176,64 @@ def test_models_endpoint_uses_proxy_providers(self): self.assertEqual(resp.get_json()["data"], [{"id": "local-model"}]) +class TestProxyEnvInterpolation(unittest.TestCase): + """${VAR:-${OTHER}} is the fallback form in proxy/example_config.yaml.""" + + def setUp(self): + self._saved = { + key: os.environ.get(key) for key in ("OPENAI_API_KEY", "OPENAI_API_KEY_2") + } + os.environ["OPENAI_API_KEY"] = "sk-primary" + os.environ.pop("OPENAI_API_KEY_2", None) + + def tearDown(self): + for key, value in self._saved.items(): + if value is None: + os.environ.pop(key, None) + else: + os.environ[key] = value + + def test_nested_default_uses_the_inner_variable(self): + text = "${OPENAI_API_KEY_2:-${OPENAI_API_KEY}}" + self.assertEqual(ProxyConfig._interpolate_env_vars(text), "sk-primary") + + def test_set_outer_variable_does_not_keep_a_trailing_brace(self): + os.environ["OPENAI_API_KEY_2"] = "sk-secondary" + text = "key=${OPENAI_API_KEY_2:-${OPENAI_API_KEY}}" + self.assertEqual(ProxyConfig._interpolate_env_vars(text), "key=sk-secondary") + + def test_simple_values_and_missing_variables_stay_compatible(self): + self.assertEqual(ProxyConfig._interpolate_env_vars("${OPENAI_API_KEY}"), "sk-primary") + self.assertEqual( + ProxyConfig._interpolate_env_vars("${MISSING_OPTILLM_VAR:-fallback}"), + "fallback", + ) + self.assertEqual( + ProxyConfig._interpolate_env_vars( + "${MISSING_OPTILLM_VAR:-literal{brace}" + ), + "literal{brace", + ) + self.assertEqual( + ProxyConfig._interpolate_env_vars("x ${MISSING_OPTILLM_VAR} y"), + "x ${MISSING_OPTILLM_VAR} y", + ) + self.assertEqual( + ProxyConfig._interpolate_env_vars( + {"api_key": "${OPENAI_API_KEY_2:-${OPENAI_API_KEY}}"} + ), + {"api_key": "sk-primary"}, + ) + with patch.dict( + os.environ, {"OPENAI_API_KEY_2": "literal-${OPENAI_API_KEY}"} + ): + self.assertEqual( + ProxyConfig._interpolate_env_vars( + "${OPENAI_API_KEY_2:-${OPENAI_API_KEY}}" + ), + "literal-${OPENAI_API_KEY}", + ) + + if __name__ == "__main__": unittest.main()