""" Flare – Spark startup notifier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Projeler açılırken Spark’a /startup çağrısı yapar. """ from __future__ import annotations import threading, requests from typing import Dict, Any from utils import log from config_provider import ConfigProvider, ProjectConfig, VersionConfig import os cfg = ConfigProvider.get() def _select_live_version(p: ProjectConfig) -> VersionConfig | None: """Yayınlanmış en güncel versiyonu getir.""" published = [v for v in p.versions if v.published] return max(published, key=lambda v: v.id) if published else None def notify_startup(): spark_base = str(cfg.global_config.spark_endpoint).rstrip("/") for p in cfg.projects: if not p.enabled: continue v = _select_live_version(p) if not v: continue plain = cfg.global_config.get_plain_token() log(f"🔑 Cloud-token starts with {plain[:6]}… (len={len(plain)})") body: Dict[str, Any] = { # ----- zorunlu alanlar ----- "work_mode": cfg.global_config.work_mode, "cloud_token": plain, "project_name": p.name, "project_version": v.id, "repo_id": v.llm.repo_id, "generation_config": v.llm.generation_config, "use_fine_tune": v.llm.use_fine_tune, "fine_tune_zip": v.llm.fine_tune_zip, } # Hugging Face token'ı ortam değişkeninden al spark_token = os.getenv("SPARK_TOKEN") if not spark_token: log("❌ SPARK_TOKEN environment variable is missing.") return headers = { "Authorization": f"Bearer {spark_token}", "Content-Type": "application/json" } try: log(f"🚀 Notifying Spark /startup for project '{p.name}' …") r = requests.post(f"{spark_base}/startup", json=body, headers=headers, timeout=10) if r.status_code >= 400: log(f"❌ Spark responded {r.status_code}: {r.text}") r.raise_for_status() log(f"✅ Spark acknowledged startup ({r.status_code})") except Exception as e: log(f"⚠️ Spark startup failed: {e}") def run_in_thread(): threading.Thread(target=notify_startup, daemon=True).start()