From 7c4df07d7111933a60481e59072d07fd19db7ca8 Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Sat, 25 Apr 2026 00:46:45 +0200 Subject: [PATCH 1/2] Default simulation gateway URL in staged deploys --- .github/scripts/validate_app_engine_deploy_env.sh | 1 - gcp/export.py | 8 +++++++- policyengine_api/libs/simulation_api_modal.py | 10 ++++++---- tests/unit/libs/test_simulation_api_modal.py | 10 ++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/scripts/validate_app_engine_deploy_env.sh b/.github/scripts/validate_app_engine_deploy_env.sh index 8dfc7941d..e69ffb094 100644 --- a/.github/scripts/validate_app_engine_deploy_env.sh +++ b/.github/scripts/validate_app_engine_deploy_env.sh @@ -3,7 +3,6 @@ set -euo pipefail required=( - SIMULATION_API_URL GATEWAY_AUTH_ISSUER GATEWAY_AUTH_AUDIENCE GATEWAY_AUTH_CLIENT_ID diff --git a/gcp/export.py b/gcp/export.py index b87bce559..b56dee80e 100644 --- a/gcp/export.py +++ b/gcp/export.py @@ -1,6 +1,10 @@ import os from pathlib import Path +DEFAULT_SIMULATION_API_URL = ( + "https://policyengine--policyengine-simulation-gateway-web-app.modal.run" +) + GAE = os.environ["GOOGLE_APPLICATION_CREDENTIALS"] # If it's a filepath, read the file. Otherwise, it'll be JSON try: @@ -14,7 +18,9 @@ ANTHROPIC_API_KEY = os.environ["ANTHROPIC_API_KEY"] OPENAI_API_KEY = os.environ["OPENAI_API_KEY"] HUGGING_FACE_TOKEN = os.environ["HUGGING_FACE_TOKEN"] -SIMULATION_API_URL = os.environ["SIMULATION_API_URL"] +SIMULATION_API_URL = ( + os.environ.get("SIMULATION_API_URL") or DEFAULT_SIMULATION_API_URL +) GATEWAY_AUTH_ISSUER = os.environ["GATEWAY_AUTH_ISSUER"] GATEWAY_AUTH_AUDIENCE = os.environ["GATEWAY_AUTH_AUDIENCE"] GATEWAY_AUTH_CLIENT_ID = os.environ["GATEWAY_AUTH_CLIENT_ID"] diff --git a/policyengine_api/libs/simulation_api_modal.py b/policyengine_api/libs/simulation_api_modal.py index 3d7660791..e64320c67 100644 --- a/policyengine_api/libs/simulation_api_modal.py +++ b/policyengine_api/libs/simulation_api_modal.py @@ -22,6 +22,11 @@ ) +DEFAULT_SIMULATION_API_URL = ( + "https://policyengine--policyengine-simulation-gateway-web-app.modal.run" +) + + @dataclass class ModalSimulationExecution: """ @@ -51,10 +56,7 @@ class SimulationAPIModal: """ def __init__(self): - self.base_url = os.environ.get( - "SIMULATION_API_URL", - "https://policyengine--policyengine-simulation-gateway-web-app.modal.run", - ) + self.base_url = os.environ.get("SIMULATION_API_URL") or DEFAULT_SIMULATION_API_URL self._token_provider = GatewayAuthTokenProvider() _require_all_or_none_gateway_auth_env() auth = ( diff --git a/tests/unit/libs/test_simulation_api_modal.py b/tests/unit/libs/test_simulation_api_modal.py index 2ec9da4f9..49b4da9ee 100644 --- a/tests/unit/libs/test_simulation_api_modal.py +++ b/tests/unit/libs/test_simulation_api_modal.py @@ -131,6 +131,16 @@ def test__given_env_var_not_set__then_uses_default_url(self, mock_httpx_client): assert "policyengine-simulation-gateway" in api.base_url assert "modal.run" in api.base_url + def test__given_env_var_blank__then_uses_default_url(self, mock_httpx_client): + # Given + with patch.dict("os.environ", {"SIMULATION_API_URL": ""}, clear=False): + # When + api = SimulationAPIModal() + + # Then + assert "policyengine-simulation-gateway" in api.base_url + assert "modal.run" in api.base_url + def test__given_gateway_auth_env_vars__then_attaches_bearer_auth( self, mock_httpx_client, monkeypatch ): From 08ba60c186de8b71787a3934c89165853a701c07 Mon Sep 17 00:00:00 2001 From: Anthony Volk Date: Sat, 25 Apr 2026 01:02:07 +0200 Subject: [PATCH 2/2] Require explicit simulation API URL per environment --- .github/scripts/validate_app_engine_deploy_env.sh | 1 + gcp/export.py | 8 +------- policyengine_api/libs/simulation_api_modal.py | 10 ++++------ tests/unit/libs/test_simulation_api_modal.py | 10 ---------- 4 files changed, 6 insertions(+), 23 deletions(-) diff --git a/.github/scripts/validate_app_engine_deploy_env.sh b/.github/scripts/validate_app_engine_deploy_env.sh index e69ffb094..8dfc7941d 100644 --- a/.github/scripts/validate_app_engine_deploy_env.sh +++ b/.github/scripts/validate_app_engine_deploy_env.sh @@ -3,6 +3,7 @@ set -euo pipefail required=( + SIMULATION_API_URL GATEWAY_AUTH_ISSUER GATEWAY_AUTH_AUDIENCE GATEWAY_AUTH_CLIENT_ID diff --git a/gcp/export.py b/gcp/export.py index b56dee80e..b87bce559 100644 --- a/gcp/export.py +++ b/gcp/export.py @@ -1,10 +1,6 @@ import os from pathlib import Path -DEFAULT_SIMULATION_API_URL = ( - "https://policyengine--policyengine-simulation-gateway-web-app.modal.run" -) - GAE = os.environ["GOOGLE_APPLICATION_CREDENTIALS"] # If it's a filepath, read the file. Otherwise, it'll be JSON try: @@ -18,9 +14,7 @@ ANTHROPIC_API_KEY = os.environ["ANTHROPIC_API_KEY"] OPENAI_API_KEY = os.environ["OPENAI_API_KEY"] HUGGING_FACE_TOKEN = os.environ["HUGGING_FACE_TOKEN"] -SIMULATION_API_URL = ( - os.environ.get("SIMULATION_API_URL") or DEFAULT_SIMULATION_API_URL -) +SIMULATION_API_URL = os.environ["SIMULATION_API_URL"] GATEWAY_AUTH_ISSUER = os.environ["GATEWAY_AUTH_ISSUER"] GATEWAY_AUTH_AUDIENCE = os.environ["GATEWAY_AUTH_AUDIENCE"] GATEWAY_AUTH_CLIENT_ID = os.environ["GATEWAY_AUTH_CLIENT_ID"] diff --git a/policyengine_api/libs/simulation_api_modal.py b/policyengine_api/libs/simulation_api_modal.py index e64320c67..3d7660791 100644 --- a/policyengine_api/libs/simulation_api_modal.py +++ b/policyengine_api/libs/simulation_api_modal.py @@ -22,11 +22,6 @@ ) -DEFAULT_SIMULATION_API_URL = ( - "https://policyengine--policyengine-simulation-gateway-web-app.modal.run" -) - - @dataclass class ModalSimulationExecution: """ @@ -56,7 +51,10 @@ class SimulationAPIModal: """ def __init__(self): - self.base_url = os.environ.get("SIMULATION_API_URL") or DEFAULT_SIMULATION_API_URL + self.base_url = os.environ.get( + "SIMULATION_API_URL", + "https://policyengine--policyengine-simulation-gateway-web-app.modal.run", + ) self._token_provider = GatewayAuthTokenProvider() _require_all_or_none_gateway_auth_env() auth = ( diff --git a/tests/unit/libs/test_simulation_api_modal.py b/tests/unit/libs/test_simulation_api_modal.py index 49b4da9ee..2ec9da4f9 100644 --- a/tests/unit/libs/test_simulation_api_modal.py +++ b/tests/unit/libs/test_simulation_api_modal.py @@ -131,16 +131,6 @@ def test__given_env_var_not_set__then_uses_default_url(self, mock_httpx_client): assert "policyengine-simulation-gateway" in api.base_url assert "modal.run" in api.base_url - def test__given_env_var_blank__then_uses_default_url(self, mock_httpx_client): - # Given - with patch.dict("os.environ", {"SIMULATION_API_URL": ""}, clear=False): - # When - api = SimulationAPIModal() - - # Then - assert "policyengine-simulation-gateway" in api.base_url - assert "modal.run" in api.base_url - def test__given_gateway_auth_env_vars__then_attaches_bearer_auth( self, mock_httpx_client, monkeypatch ):