From 658a26d1f7cb0ad9d5c023ec4c8b1413665cbc6f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 11:45:38 +0000 Subject: [PATCH 1/2] Add main() and __main__ guard to server/app.py for multi-mode deployment Agent-Logs-Url: https://github.com/bigturtle679/Contract-Negotiation-Environment/sessions/8a71a610-0371-4d52-92e9-3a3562765013 Co-authored-by: AbeerChaturvedi <171315954+AbeerChaturvedi@users.noreply.github.com> --- server/app.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/app.py b/server/app.py index 65bc94e..eeee28d 100644 --- a/server/app.py +++ b/server/app.py @@ -5,3 +5,7 @@ """ from contract_env.server.app import app # noqa: F401 +from contract_env.server.app import main # noqa: F401 + +if __name__ == "__main__": + main() From 059fb87e733249017d0d97e440a2945c85429e8a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 11:53:16 +0000 Subject: [PATCH 2/2] Fix load_dotenv timing bug, remove global RNG seed, improve error handling - inference.py: Call load_dotenv() at module level before os.getenv() reads, fixing a bug where .env-only config was silently ignored - environment.py: Remove module-level random.seed(42) that unnecessarily polluted the global RNG (class already uses its own Random instance) - server/app.py: Catch RuntimeError from step-before-reset separately and return 400 instead of 500 (it's a client error, not a server error) - hf_create.py: Add timeout=30 to urlopen to prevent indefinite hangs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: AbeerChaturvedi <171315954+AbeerChaturvedi@users.noreply.github.com> --- contract_env/env/environment.py | 2 -- contract_env/server/app.py | 2 ++ hf_create.py | 2 +- inference.py | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contract_env/env/environment.py b/contract_env/env/environment.py index 32cb4f0..55186cf 100644 --- a/contract_env/env/environment.py +++ b/contract_env/env/environment.py @@ -11,8 +11,6 @@ from contract_env.env.models import Action, Observation from contract_env.env.tasks import TASKS, NegotiationTask -random.seed(42) - class ContractEnv: """Multi-turn contract-negotiation environment. diff --git a/contract_env/server/app.py b/contract_env/server/app.py index f2d5ed0..760ef5a 100644 --- a/contract_env/server/app.py +++ b/contract_env/server/app.py @@ -143,6 +143,8 @@ def step(req: StepRequest) -> dict[str, Any]: "info": info, } + except RuntimeError as e: + raise HTTPException(status_code=400, detail=str(e)) except ValidationError as e: raise HTTPException(status_code=422, detail=e.errors()) except Exception: diff --git a/hf_create.py b/hf_create.py index f331ef3..01cb416 100644 --- a/hf_create.py +++ b/hf_create.py @@ -22,7 +22,7 @@ req = urllib.request.Request(url, headers=headers, data=data) try: - with urllib.request.urlopen(req) as resp: + with urllib.request.urlopen(req, timeout=30) as resp: print(resp.read().decode("utf-8")) except Exception as e: import traceback diff --git a/inference.py b/inference.py index 8e2eedc..3743f3b 100644 --- a/inference.py +++ b/inference.py @@ -40,6 +40,10 @@ def load_dotenv(*_a: Any, **_kw: Any) -> None: # type: ignore[misc] pass +# Load .env BEFORE reading any environment variables so that .env-only +# configuration is picked up by the module-level constants below. +load_dotenv() + from openai import OpenAI from contract_env.env.environment import ContractEnv @@ -652,7 +656,6 @@ def run_episode(env, task_id: Optional[str] = None) -> tuple[float, str]: # ── MAIN ───────────────────────────────────────────────────────────────── def main() -> None: - load_dotenv() random.seed(42) parser = argparse.ArgumentParser(