File size: 2,237 Bytes
24ceec5
 
f76a56f
 
24ceec5
f76a56f
ccb935d
 
 
 
 
df180e7
ccb935d
24ceec5
 
 
 
ccb935d
24ceec5
 
 
 
 
ccb935d
 
 
24ceec5
 
 
f76a56f
 
24ceec5
 
f76a56f
 
 
 
 
 
 
 
 
 
 
24ceec5
 
 
 
 
 
 
 
 
 
f76a56f
963e30d
 
24ceec5
f76a56f
 
 
24ceec5
 
 
 
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
"""SoniCoder v2 β€” Entry point.

Uses FastAPI directly (not gradio.Server) so our custom index.html
is always served at / without Gradio overriding the root route.

Model is loaded BLOCKING before server starts β€” no lazy loading.
"""

from __future__ import annotations

import logging
import os

# Ensure workspace exists
from sonicoder.config import WORKSPACE_ROOT, CONFIG_DIR
WORKSPACE_ROOT.mkdir(parents=True, exist_ok=True)
CONFIG_DIR.mkdir(parents=True, exist_ok=True)

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
    datefmt="%H:%M:%S",
)
logger = logging.getLogger(__name__)


def main():
    logger.info("SoniCoder v2 starting...")

    # ── BLOCKING model load β€” model must be ready BEFORE server starts ──
    from sonicoder.model.loader import load_model
    from sonicoder.config import load_settings
    settings = load_settings()
    model_key = settings.default_model
    logger.info(f"Loading model {model_key} (blocking)...")
    try:
        load_model(model_key)
        logger.info("Model loaded successfully β€” ready to serve")
    except Exception as e:
        logger.error(f"Failed to load model: {e}")
        logger.info("Server will start anyway β€” model can be loaded later via API")

    # ── Set up MCP servers from config ─────────────────────────────────
    from sonicoder.mcp import get_mcp_manager
    if settings.mcp_servers:
        mcp = get_mcp_manager()
        mcp.configure(settings.mcp_servers)
        results = mcp.connect_all()
        for name, error in results.items():
            if error:
                logger.warning(f"MCP server '{name}' failed: {error}")
            else:
                logger.info(f"MCP server '{name}' connected")

    # ── Create the FastAPI server ──────────────────────────────────────
    from sonicoder.server import create_app
    app = create_app()

    logger.info("Launching on 0.0.0.0:7860...")
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=7860, log_level="info")


if __name__ == "__main__":
    main()