""" Lightweight event emitter for the GPU inference server. Pushes debug logs to the same Redis stream as the pipeline orchestrator, so GPU-side details (model load, VRAM, inference timing) appear in the same log panel. Only active when the request includes X-Job-Id header. No dependency on the detect package. """ from __future__ import annotations import json import os from datetime import datetime, timezone import redis REDIS_URL = os.environ.get("REDIS_URL", "redis://localhost:6379/0") EVENTS_PREFIX = "detect_events" _LEVEL_ORDER = {"DEBUG": 0, "INFO": 1, "WARN": 2, "ERROR": 3} _redis_client = None def _get_redis(): global _redis_client if _redis_client is None: _redis_client = redis.from_url(REDIS_URL, decode_responses=True) return _redis_client def log(job_id: str, stage: str, level: str, msg: str, log_level: str = "INFO"): """Push a log event to Redis if the level meets the threshold.""" if not job_id: return if _LEVEL_ORDER.get(level.upper(), 1) < _LEVEL_ORDER.get(log_level.upper(), 1): return r = _get_redis() key = f"{EVENTS_PREFIX}:{job_id}" event = json.dumps({ "event": "log", "level": level, "stage": stage, "msg": msg, "ts": datetime.now(timezone.utc).isoformat(), }) r.rpush(key, event) r.expire(key, 3600)