import sys import os import types import logging import subprocess from pathlib import Path import torch from fastapi import FastAPI from fastapi.responses import HTMLResponse logging.basicConfig(level=logging.INFO, format="%(asctime)s | %(levelname)s | %(message)s") logger = logging.getLogger(__name__) # ── 0. تحديث kagglehub (مهم جداً!) ──────────────────────── try: subprocess.check_call([ sys.executable, "-m", "pip", "install", "-q", "--upgrade", "kagglehub>=1.0.2" ]) logger.info("✅ kagglehub upgraded") except Exception as e: logger.warning(f"⚠️ upgrade failed: {e}") import kagglehub # ── 1. Kaggle Credentials ───────────────────────────────── kaggle_username = os.environ.get("KAGGLE_USERNAME") kaggle_key = os.environ.get("KAGGLE_KEY") if kaggle_username and kaggle_key: os.environ["KAGGLE_USERNAME"] = kaggle_username os.environ["KAGGLE_KEY"] = kaggle_key kaggle_dir = Path.home() / ".kaggle" kaggle_dir.mkdir(parents=True, exist_ok=True) kaggle_json = kaggle_dir / "kaggle.json" kaggle_json.write_text(f'{{"username":"{kaggle_username}","key":"{kaggle_key}"}}') os.chmod(kaggle_json, 0o600) logger.info("✅ Kaggle credentials configured") else: logger.warning("⚠️ KAGGLE_USERNAME/KAGGLE_KEY not set") # ── 2. تحميل النموذج (النسخة 3 + force_download) ─────────── model_path = None try: logger.info("⬇️ [Attempt 1] transformers/default/19 + force_download") model_path = kagglehub.model_download( "ruicompany/onyx-code-figma/transformers/default/19", force_download=True ) logger.info(f"✅ Success: {model_path}") except Exception as e: logger.error(f"❌ Attempt 1 failed: {e}") # محاولة 2: keras/default/3 (احتياطي) if not model_path: try: logger.info("⬇️ [Attempt 2] keras/default/19") model_path = kagglehub.model_download( "ruicompany/onyx-code-figma/keras/default/19", force_download=True ) logger.info(f"✅ Success: {model_path}") except Exception as e: logger.error(f"❌ Attempt 2 failed: {e}") # محاولة 3: dataset_download (أكثر استقراراً) if not model_path: try: logger.info("⬇️ [Attempt 3] dataset_download") model_path = kagglehub.dataset_download("ruicompany/onyx-code-figma") logger.info(f"✅ Success: {model_path}") except Exception as e: logger.error(f"❌ Attempt 3 failed: {e}") # محاولة 4: مسار محلي if not model_path: local_paths = [ "/app/model", "./model", "/kaggle/working/onyx-code-figma-bundle", "./onyx-code-figma-bundle", ] for p in local_paths: if os.path.exists(p) and any(Path(p).rglob("*.safetensors")): model_path = p logger.info(f"✅ [Fallback] Local path: {p}") break if not model_path: logger.error("🚨 All download attempts failed!") model_path = None # ── 3. فحص الملفات ──────────────────────────────────────── if model_path: logger.info("📁 Files in model path:") for f in sorted(Path(model_path).rglob("*"))[:30]: logger.info(f" {f.relative_to(model_path)}") # ── 4. البحث عن onyx_code.py ────────────────────────────── onyx_code_dir = None if model_path: for py_file in Path(model_path).rglob("onyx_code.py"): onyx_code_dir = py_file.parent logger.info(f"🔍 Found onyx_code.py: {py_file}") break # ── 5. Monkey-patch IPython ──────────────────────────────── captured_html = [] class MockHTML: def __init__(self, data=None, **kwargs): self.data = data or "" def mock_display(*objs, **kwargs): for obj in objs: if hasattr(obj, 'data') and isinstance(obj.data, str): captured_html.append(obj.data) elif isinstance(obj, str): captured_html.append(obj) ipython_pkg = types.ModuleType("IPython") ipython_display = types.ModuleType("IPython.display") ipython_display.HTML = MockHTML ipython_display.display = mock_display ipython_display.display_html = mock_display ipython_display.clear_output = lambda *a, **k: None ipython_display.Javascript = lambda *a, **k: MockHTML() ipython_pkg.display = ipython_display sys.modules["IPython"] = ipython_pkg sys.modules["IPython.display"] = ipython_display # ── 6. استيراد onyx_code ────────────────────────────────── html_content = "

⚠️ Onyx Designer not loaded

" if onyx_code_dir: sys.path.insert(0, str(onyx_code_dir)) try: import onyx_code logger.info("✅ onyx_code imported") if hasattr(onyx_code, 'launch_designer'): onyx_code.launch_designer() html_content = captured_html[-1] if captured_html else html_content logger.info(f"📄 HTML: {len(html_content)} chars") except Exception as e: logger.error(f"❌ Error: {e}") import traceback logger.error(traceback.format_exc()) # ── 7. تحميل Transformers Model ─────────────────────────── model = None tokenizer = None if model_path and any(Path(model_path).rglob("*.safetensors")): try: from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig quantization_config = BitsAndBytesConfig( load_in_8bit=True, llm_int8_enable_fp32_cpu_offload=True, ) model = AutoModelForCausalLM.from_pretrained( model_path, quantization_config=quantization_config, device_map="auto", max_memory={0: "0GB", "cpu": "6GB"}, offload_buffers=True, offload_folder="offload", offload_state_dict=True, torch_dtype=torch.float32, trust_remote_code=True, ) tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) logger.info("✅ Model loaded") except Exception as e: logger.error(f"❌ Model load failed: {e}") # ── 8. FastAPI ──────────────────────────────────────────── app = FastAPI(title="Onyx Code Figma API") @app.get("/", response_class=HTMLResponse) def read_root(): return html_content @app.get("/health") def health_check(): return { "model_loaded": model is not None, "model_path": model_path, "html_length": len(html_content), } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)