File size: 7,118 Bytes
8aef1c7
5141a9b
fba050f
fea091a
e9ef7a4
fea091a
 
8aef1c7
5141a9b
 
6c95f03
e9ef7a4
fea091a
e5bec3e
e9ef7a4
 
 
 
 
 
 
 
 
 
 
 
32f428b
 
 
 
 
 
e9ef7a4
 
 
 
 
 
32f428b
e9ef7a4
32f428b
765d4ef
32f428b
9aa5cfd
fea091a
5a141f8
765d4ef
5a141f8
765d4ef
 
e9ef7a4
fea091a
e9ef7a4
 
765d4ef
e9ef7a4
 
5a141f8
765d4ef
5a141f8
765d4ef
 
e9ef7a4
 
 
 
765d4ef
e9ef7a4
 
 
 
 
 
 
 
765d4ef
e9ef7a4
 
 
765d4ef
32f428b
 
 
e9ef7a4
32f428b
 
e9ef7a4
32f428b
9aa5cfd
e9ef7a4
 
 
e5bec3e
e9ef7a4
fea091a
e9ef7a4
 
 
e5bec3e
e9ef7a4
32f428b
fea091a
32f428b
 
e9ef7a4
32f428b
fea091a
e9ef7a4
fea091a
10d62a6
 
e9ef7a4
fea091a
 
 
 
 
 
 
 
 
fba050f
 
 
 
e9ef7a4
fea091a
 
10d62a6
fea091a
fba050f
 
10d62a6
e9ef7a4
 
10d62a6
32f428b
 
fea091a
 
e9ef7a4
fea091a
 
e9ef7a4
 
fea091a
e9ef7a4
32f428b
 
 
e9ef7a4
32f428b
 
 
e9ef7a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e5bec3e
e9ef7a4
fea091a
e5bec3e
 
 
fea091a
 
 
 
 
 
 
 
 
 
 
 
32f428b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
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 = "<h2>โš ๏ธ Onyx Designer not loaded</h2>"

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)