#!/usr/bin/env python3
"""
bindu.protocol — Sovereign GPU Inference & Embeddings Gateway
Exposes OpenAI-Compatible vLLM API (:8000) and HuggingFace TEI Embeddings API (:8080)
backed by a local Ollama or llama.cpp runtime (:11434) for ASUS GX10 / Apple Silicon / Linux GPU nodes.
"""
import json, os, sys, threading, time, urllib.request
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer

OLLAMA_BASE = os.environ.get("OLLAMA_BASE_URL", "http://127.0.0.1:11434")
VLLM_PORT = int(os.environ.get("VLLM_PORT", "8000"))
TEI_PORT = int(os.environ.get("TEI_PORT", "8080"))
NODE_ID = os.environ.get("BINDU_NODE_ID", "node-nvda-spark")

MODEL_ALIASES = {
    "Qwen/Qwen2.5-Coder-32B-Instruct": "qwen2.5-coder:32b",
    "qwen2.5-coder:32b": "qwen2.5-coder:32b",
    "deepseek-r1:70b": "deepseek-r1:70b",
    "BAAI/bge-m3": "bge-m3:latest",
    "nomic-embed-text": "nomic-embed-text:latest",
}

class VLLMHandler(BaseHTTPRequestHandler):
    def log_message(self, fmt, *args): pass
    def _send(self, code, payload):
        raw = json.dumps(payload).encode("utf-8")
        self.send_response(code)
        self.send_header("Content-Type", "application/json")
        self.send_header("Content-Length", str(len(raw)))
        self.end_headers()
        self.wfile.write(raw)

    def do_GET(self):
        if self.path == "/health":
            return self._send(200, {"status": "ok", "nodeId": NODE_ID})
        if self.path.startswith("/v1/models"):
            now = int(time.time())
            return self._send(200, {"object": "list", "data": [{"id": k, "object": "model", "created": now} for k in MODEL_ALIASES]})
        self._send(200, {"status": "ok"})

    def do_POST(self):
        length = int(self.headers.get("Content-Length", "0"))
        body = json.loads(self.rfile.read(length).decode("utf-8")) if length > 0 else {}
        req_model = body.get("model", "Qwen/Qwen2.5-Coder-32B-Instruct")
        body["model"] = MODEL_ALIASES.get(req_model, req_model)
        req = urllib.request.Request(
            f"{OLLAMA_BASE}{self.path}",
            data=json.dumps(body).encode("utf-8"),
            headers={"Content-Type": "application/json"},
            method="POST",
        )
        try:
            with urllib.request.urlopen(req, timeout=300) as resp:
                data = json.loads(resp.read().decode("utf-8"))
                data["model"] = req_model
                self._send(200, data)
        except Exception as e:
            self._send(500, {"error": {"message": str(e)}})

if __name__ == "__main__":
    srv = ThreadingHTTPServer(("0.0.0.0", VLLM_PORT), VLLMHandler)
    print(f"bindu.protocol GPU Gateway listening on 0.0.0.0:{VLLM_PORT} -> {OLLAMA_BASE}")
    srv.serve_forever()
