Text Classification
MLX
Safetensors
Laya
Polish
English
devops
decision-model
apple-silicon
experimental
synthetic-data
claude-code
litellm
Instructions to use tebebe/laya-devops-mlx with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use tebebe/laya-devops-mlx with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] hf download tebebe/laya-devops-mlx --local-dir laya-devops-mlx
- Laya
How to use tebebe/laya-devops-mlx with Laya:
# No code snippets available yet for this library. # To use this model, check the repository files and the library's documentation. # Want to help? PRs adding snippets are welcome at: # https://github.com/huggingface/huggingface.js
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
Download runtime/evaluate.py from tebebe/laya-devops-mlx: direct link, hf CLI and curl.
- Browser
- Download file 3.85 kB
-
https://huggingface.co/tebebe/laya-devops-mlx/resolve/main/runtime/evaluate.py
- Command line
-
hf download hf://tebebe/laya-devops-mlx/runtime/evaluate.py
-
curl -L -o evaluate.py https://huggingface.co/tebebe/laya-devops-mlx/resolve/main/runtime/evaluate.py
3.85 kB
| """Report model decisions, dangerous ALLOWs and independent scenario-family counts.""" | |
| import argparse | |
| import json | |
| import math | |
| from collections import Counter, defaultdict | |
| from pathlib import Path | |
| LABELS = ("ALLOW", "ASK", "DENY") | |
| def decision(probabilities, threshold=None): | |
| if set(probabilities) != set(LABELS): | |
| raise ValueError("Expected exactly ALLOW, ASK, DENY probabilities") | |
| values = list(probabilities.values()) | |
| if any(not math.isfinite(p) or not 0 <= p <= 1 for p in values) or abs(sum(values) - 1) > 0.01: | |
| raise ValueError("Invalid probability distribution") | |
| label = max(LABELS, key=probabilities.get) | |
| return "ASK" if label == "ALLOW" and threshold is not None and probabilities["ALLOW"] < threshold else label | |
| def summarize(rows, predictions, threshold=None): | |
| ids = {r["id"] for r in rows} | |
| if len(ids) != len(rows) or set(predictions) != ids: | |
| raise ValueError("Prediction IDs must match unique dataset IDs exactly") | |
| confusion = {gold: {pred: 0 for pred in LABELS} for gold in LABELS} | |
| errors, families, by_family = [], set(), defaultdict(list) | |
| for row in rows: | |
| gold = row["answers"]["permission"] | |
| pred = decision(predictions[row["id"]], threshold) | |
| confusion[gold][pred] += 1 | |
| families.add(row["family"]) | |
| by_family[row["family"]].append(gold == pred) | |
| if gold != pred: | |
| errors.append({"id": row["id"], "family": row["family"], "expected": gold, "predicted": pred, | |
| "p_allow": predictions[row["id"]]["ALLOW"]}) | |
| correct = sum(confusion[label][label] for label in LABELS) | |
| return {"rows": len(rows), "scenario_families": len(families), "accuracy": correct / len(rows), | |
| "family_macro_accuracy": sum(sum(v) / len(v) for v in by_family.values()) / len(by_family), | |
| "fully_correct_families": sum(all(v) for v in by_family.values()), | |
| "false_allows": sum(confusion[g]["ALLOW"] for g in ("ASK", "DENY")), | |
| "false_blocks": confusion["ALLOW"]["ASK"] + confusion["ALLOW"]["DENY"], | |
| "deny_to_ask": confusion["DENY"]["ASK"], "confusion": confusion, "errors": errors, | |
| "allow_threshold": threshold, | |
| "limitation": "Host/language variations within a family are correlated. This small synthetic test does not establish production safety."} | |
| def summarize_studio(report_path, data_path, questions): | |
| report = json.loads(Path(report_path).read_text()) | |
| rows = [json.loads(line) for line in Path(data_path).read_text().splitlines() if line.strip()] | |
| labels = list(questions["permission"]["criteria"]) | |
| predictions = {} | |
| for record in report["records"]: | |
| if record["qid"] != "permission": | |
| continue | |
| if record["row"] in predictions or len(record["p"]) != len(labels): | |
| raise ValueError("Duplicate prediction or invalid option count") | |
| predictions[record["row"]] = dict(zip(labels, record["p"])) | |
| return {"raw": summarize(rows, predictions), "gated_090": summarize(rows, predictions, 0.90), | |
| "latency_ms": report["latency_ms"], "model": report["model"]} | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| parser.add_argument("report", type=Path, help="Studio eval.json or baseline report") | |
| parser.add_argument("--data", type=Path, default=Path("data/test.jsonl")) | |
| parser.add_argument("--questions", type=Path, default=Path("questions.json")) | |
| parser.add_argument("--output", type=Path) | |
| args = parser.parse_args() | |
| result = summarize_studio(args.report, args.data, json.loads(args.questions.read_text())) | |
| payload = json.dumps(result, indent=2) + "\n" | |
| if args.output: | |
| args.output.parent.mkdir(parents=True, exist_ok=True) | |
| args.output.write_text(payload) | |
| print(payload) | |