import warnings import pandas as pd import joblib try: import cuml except ImportError: pass try: import xgboost except ImportError: pass try: import catboost except ImportError: pass try: import dense_utils except ImportError: pass warnings.filterwarnings("ignore", module="sklearn") class CommitClassifier: def __init__(self, model_path="model.joblib"): self._model_path = model_path self._model = None self._label_enc = None def _ensure(self): if self._model is None: data = joblib.load(self._model_path) self._model = data["model"] self._label_enc = data["label_encoder"] return self._model, self._label_enc def _build_scores(self, probs): return sorted( zip(self._label_enc.classes_, probs), key=lambda x: x[1], reverse=True, ) def sort( self, text, files_count=0, additions=0, deletions=0, changed_tests=0, changed_docs=0, changed_source=0, has_tests=False, has_docs=False, extensions=None, directories=None, ): model, label_enc = self._ensure() row = { "text": text, "files_count": files_count, "additions": additions, "deletions": deletions, "changed_tests": changed_tests, "changed_docs": changed_docs, "changed_source": changed_source, "has_tests": int(has_tests), "has_docs": int(has_docs), "extensions": " ".join(extensions or []), "directories": " ".join(directories or []), } df = pd.DataFrame([row]) pred = model.predict(df)[0] probs = model.predict_proba(df)[0] label = label_enc.inverse_transform([pred])[0] return label, self._build_scores(probs) def sort_batch(self, records): model, label_enc = self._ensure() rows = [] for r in records: rows.append({ "text": r["text"], "files_count": r.get("files_count", 0), "additions": r.get("additions", 0), "deletions": r.get("deletions", 0), "changed_tests": r.get("changed_tests", 0), "changed_docs": r.get("changed_docs", 0), "changed_source": r.get("changed_source", 0), "has_tests": int(r.get("has_tests", False)), "has_docs": int(r.get("has_docs", False)), "extensions": " ".join(r.get("extensions", [])), "directories": " ".join(r.get("directories", [])), }) df = pd.DataFrame(rows) preds = model.predict(df) probs = model.predict_proba(df) results = [] for i in range(len(records)): label = label_enc.inverse_transform([preds[i]])[0] scores = self._build_scores(probs[i]) results.append({"label": label, "probs": dict(scores)}) return results