Spaces:
Configuration error
Configuration error
Commit ·
dbee4da
1
Parent(s): c2dd900
Support HF-safe Space variable names
Browse files- README.md +11 -0
- inference.py +14 -4
- 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 |
-
|
| 79 |
-
|
| 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":
|
| 100 |
-
"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 =
|
| 189 |
-
api_key =
|
| 190 |
-
api_base_url =
|
| 191 |
|
| 192 |
if model_name or api_key:
|
| 193 |
if not model_name or not api_key:
|
| 194 |
-
raise RuntimeError(
|
|
|
|
|
|
|
|
|
|
| 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(
|
|
|
|
|
|
|
|
|
|
| 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()
|