DevikaJ2005 commited on
Commit
dbee4da
·
1 Parent(s): c2dd900

Support HF-safe Space variable names

Browse files
Files changed (3) hide show
  1. README.md +11 -0
  2. inference.py +14 -4
  3. llm_agent.py +21 -5
README.md CHANGED
@@ -132,6 +132,14 @@ MODEL_NAME=<your-model-id>
132
  HF_TOKEN=<your-token>
133
  ```
134
 
 
 
 
 
 
 
 
 
135
  Run it with:
136
 
137
  ```bash
@@ -260,6 +268,7 @@ Then verify:
260
  Do not commit or publish:
261
 
262
  - `HF_TOKEN`
 
263
  - `OPENAI_API_KEY`
264
  - `API_KEY`
265
  - `kaggle.json`
@@ -269,7 +278,9 @@ Do not commit or publish:
269
  Safe to keep public:
270
 
271
  - `API_BASE_URL`
 
272
  - `MODEL_NAME`
 
273
  - `openenv.yaml`
274
  - `fraudshield_baseline_results.json`
275
  - `data/fraudshield_cases.json`
 
132
  HF_TOKEN=<your-token>
133
  ```
134
 
135
+ If your Hugging Face Space rejects underscores in variable names, FraudShield also accepts these aliases:
136
+
137
+ ```bash
138
+ APIBASEURL=https://router.huggingface.co/v1
139
+ MODELNAME=<your-model-id>
140
+ HFTOKEN=<your-token>
141
+ ```
142
+
143
  Run it with:
144
 
145
  ```bash
 
268
  Do not commit or publish:
269
 
270
  - `HF_TOKEN`
271
+ - `HFTOKEN`
272
  - `OPENAI_API_KEY`
273
  - `API_KEY`
274
  - `kaggle.json`
 
278
  Safe to keep public:
279
 
280
  - `API_BASE_URL`
281
+ - `APIBASEURL`
282
  - `MODEL_NAME`
283
+ - `MODELNAME`
284
  - `openenv.yaml`
285
  - `fraudshield_baseline_results.json`
286
  - `data/fraudshield_cases.json`
inference.py CHANGED
@@ -19,6 +19,16 @@ logger = logging.getLogger(__name__)
19
  RESULTS_FILE = "fraudshield_baseline_results.json"
20
 
21
 
 
 
 
 
 
 
 
 
 
 
22
  def run_task(env: FraudShieldEnvironment, agent: object, task_name: str) -> Tuple[List[str], List[str], List[float]]:
23
  """Run one task episode and capture the full prediction trace."""
24
 
@@ -75,8 +85,8 @@ def main() -> Dict[str, object]:
75
  logger.info(
76
  "Agent mode: %s | API_BASE_URL=%s | MODEL_NAME=%s",
77
  getattr(agent, "name", agent.__class__.__name__),
78
- os.getenv("API_BASE_URL", "https://router.huggingface.co/v1"),
79
- os.getenv("MODEL_NAME", "<offline-heuristic>"),
80
  )
81
 
82
  easy_predictions, easy_ground_truth, easy_confidences = run_task(env, agent, "easy")
@@ -96,8 +106,8 @@ def main() -> Dict[str, object]:
96
  )
97
  grading_result["metadata"] = {
98
  "agent_name": getattr(agent, "name", agent.__class__.__name__),
99
- "api_base_url": os.getenv("API_BASE_URL", "https://router.huggingface.co/v1"),
100
- "model_name": os.getenv("MODEL_NAME", ""),
101
  "seed": 42,
102
  "data_snapshot": env.data_loader.get_bundle_summary(),
103
  "tasks": {
 
19
  RESULTS_FILE = "fraudshield_baseline_results.json"
20
 
21
 
22
+ def get_env(*names: str, default: str = "") -> str:
23
+ """Return the first non-empty environment variable from a list of aliases."""
24
+
25
+ for name in names:
26
+ value = os.getenv(name)
27
+ if value:
28
+ return value
29
+ return default
30
+
31
+
32
  def run_task(env: FraudShieldEnvironment, agent: object, task_name: str) -> Tuple[List[str], List[str], List[float]]:
33
  """Run one task episode and capture the full prediction trace."""
34
 
 
85
  logger.info(
86
  "Agent mode: %s | API_BASE_URL=%s | MODEL_NAME=%s",
87
  getattr(agent, "name", agent.__class__.__name__),
88
+ get_env("API_BASE_URL", "APIBASEURL", default="https://router.huggingface.co/v1"),
89
+ get_env("MODEL_NAME", "MODELNAME", default="<offline-heuristic>"),
90
  )
91
 
92
  easy_predictions, easy_ground_truth, easy_confidences = run_task(env, agent, "easy")
 
106
  )
107
  grading_result["metadata"] = {
108
  "agent_name": getattr(agent, "name", agent.__class__.__name__),
109
+ "api_base_url": get_env("API_BASE_URL", "APIBASEURL", default="https://router.huggingface.co/v1"),
110
+ "model_name": get_env("MODEL_NAME", "MODELNAME"),
111
  "seed": 42,
112
  "data_snapshot": env.data_loader.get_bundle_summary(),
113
  "tasks": {
llm_agent.py CHANGED
@@ -17,6 +17,16 @@ except ImportError: # pragma: no cover - dependency installed in submission ima
17
  logger = logging.getLogger(__name__)
18
 
19
 
 
 
 
 
 
 
 
 
 
 
20
  class HeuristicFraudDetectionAgent:
21
  """Deterministic local fallback for offline testing."""
22
 
@@ -185,18 +195,24 @@ class OpenAIFraudDetectionAgent:
185
  def build_default_agent() -> object:
186
  """Create the required OpenAI client agent when configured, else use the offline fallback."""
187
 
188
- model_name = os.getenv("MODEL_NAME")
189
- api_key = os.getenv("HF_TOKEN") or os.getenv("OPENAI_API_KEY") or os.getenv("API_KEY")
190
- api_base_url = os.getenv("API_BASE_URL", "https://router.huggingface.co/v1")
191
 
192
  if model_name or api_key:
193
  if not model_name or not api_key:
194
- raise RuntimeError("Both MODEL_NAME and HF_TOKEN/OPENAI_API_KEY must be set for OpenAI baseline mode.")
 
 
 
195
  return OpenAIFraudDetectionAgent(
196
  model_name=model_name,
197
  api_key=api_key,
198
  api_base_url=api_base_url,
199
  )
200
 
201
- logger.warning("MODEL_NAME and HF_TOKEN were not set. Falling back to the deterministic heuristic agent.")
 
 
 
202
  return HeuristicFraudDetectionAgent()
 
17
  logger = logging.getLogger(__name__)
18
 
19
 
20
+ def get_env(*names: str, default: Optional[str] = None) -> Optional[str]:
21
+ """Return the first non-empty environment variable from a list of aliases."""
22
+
23
+ for name in names:
24
+ value = os.getenv(name)
25
+ if value:
26
+ return value
27
+ return default
28
+
29
+
30
  class HeuristicFraudDetectionAgent:
31
  """Deterministic local fallback for offline testing."""
32
 
 
195
  def build_default_agent() -> object:
196
  """Create the required OpenAI client agent when configured, else use the offline fallback."""
197
 
198
+ model_name = get_env("MODEL_NAME", "MODELNAME")
199
+ api_key = get_env("HF_TOKEN", "HFTOKEN", "OPENAI_API_KEY", "OPENAIAPIKEY", "API_KEY", "APIKEY")
200
+ api_base_url = get_env("API_BASE_URL", "APIBASEURL", default="https://router.huggingface.co/v1")
201
 
202
  if model_name or api_key:
203
  if not model_name or not api_key:
204
+ raise RuntimeError(
205
+ "Both MODEL_NAME/MODELNAME and HF_TOKEN/HFTOKEN "
206
+ "(or OPENAI_API_KEY/API_KEY) must be set for OpenAI baseline mode."
207
+ )
208
  return OpenAIFraudDetectionAgent(
209
  model_name=model_name,
210
  api_key=api_key,
211
  api_base_url=api_base_url,
212
  )
213
 
214
+ logger.warning(
215
+ "MODEL_NAME/MODELNAME and HF_TOKEN/HFTOKEN were not set. "
216
+ "Falling back to the deterministic heuristic agent."
217
+ )
218
  return HeuristicFraudDetectionAgent()