Spaces:
Running
Running
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| """ | |
| loop.py — cloud runner for confluence-agent on Hugging Face Spaces (Docker). | |
| - HF ke liye ek chhota health-check HTTP server PORT (7860) pe (warna Space "running" | |
| nahi maana jata). | |
| - Phir har CYCLE_SECONDS (default 900 = 15m) pe agent.main() chalata hai (Telegram alerts). | |
| Har cycle exception-safe; ek cycle fail ho to agla normally chalega. | |
| Telegram creds env se: TG_TOKEN, TG_CHAT_ID (Space secrets). | |
| """ | |
| import os | |
| import time | |
| import threading | |
| import traceback | |
| from datetime import datetime, timezone | |
| from http.server import BaseHTTPRequestHandler, HTTPServer | |
| import agent # agent.py (same dir) | |
| INTERVAL = int(os.getenv("CYCLE_SECONDS", "900")) # 15 min | |
| PORT = int(os.getenv("PORT", "7860")) | |
| _last = {"ts": None, "ok": None} | |
| class Ping(BaseHTTPRequestHandler): | |
| def do_GET(self): | |
| self.send_response(200) | |
| self.send_header("Content-Type", "text/plain") | |
| self.end_headers() | |
| msg = f"confluence-agent running\nlast_cycle={_last['ts']} ok={_last['ok']}\n" | |
| self.wfile.write(msg.encode()) | |
| def log_message(self, *args): | |
| pass | |
| def start_http(): | |
| HTTPServer(("0.0.0.0", PORT), Ping).serve_forever() | |
| def main(): | |
| threading.Thread(target=start_http, daemon=True).start() | |
| print(f"[loop] health server on :{PORT}; cycle every {INTERVAL}s", flush=True) | |
| while True: | |
| t0 = time.time() | |
| try: | |
| agent.main() | |
| _last["ok"] = True | |
| except Exception: | |
| _last["ok"] = False | |
| print("[loop] CYCLE ERROR:\n" + traceback.format_exc(), flush=True) | |
| _last["ts"] = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC") | |
| dt = time.time() - t0 | |
| sleep_s = max(30, INTERVAL - dt) | |
| print(f"[loop] cycle took {dt:.0f}s; sleeping {sleep_s:.0f}s", flush=True) | |
| time.sleep(sleep_s) | |
| if __name__ == "__main__": | |
| main() | |