|
|
import { createServer, IncomingMessage, ServerResponse } from "node:http"; |
|
|
import { OpenAIService } from "./openai-service"; |
|
|
|
|
|
const openAIService = new OpenAIService(); |
|
|
|
|
|
const log = (msg: string) => { |
|
|
const time = new Date().toISOString().split('T')[1].split('.')[0]; |
|
|
console.log(`[${time}] ${msg}`); |
|
|
}; |
|
|
|
|
|
const HTML_FRONTEND = ` |
|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>AI Research Playground</title> |
|
|
<style> |
|
|
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0b0e14; color: #e6edf3; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0; } |
|
|
.container { text-align: center; border: 1px solid #30363d; padding: 40px; border-radius: 12px; background: #161b22; max-width: 500px; } |
|
|
h1 { color: #58a6ff; margin-bottom: 10px; } |
|
|
p { color: #8b949e; line-height: 1.6; } |
|
|
.status { display: inline-block; padding: 4px 12px; border-radius: 20px; background: #238636; color: white; font-size: 14px; margin-top: 20px; } |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<div class="container"> |
|
|
<h1>🔬 Research API</h1> |
|
|
<p>This Space hosts a distributed language model inference engine for academic research and integration testing.</p> |
|
|
<div class="status">System Online</div> |
|
|
<p style="font-size: 12px; margin-top: 30px;">Authorized access only via encrypted endpoints.</p> |
|
|
</div> |
|
|
</body> |
|
|
</html> |
|
|
`; |
|
|
|
|
|
const API_KEY = process.env.API_KEY || "MySecretKey_12345"; |
|
|
const PORT = Number(process.env.PORT) || 7860; |
|
|
|
|
|
const server = createServer(async (req: IncomingMessage, res: ServerResponse) => { |
|
|
try { |
|
|
const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`); |
|
|
const method = req.method; |
|
|
|
|
|
|
|
|
const corsHeaders = { |
|
|
"Access-Control-Allow-Origin": "*", |
|
|
"Access-Control-Allow-Methods": "GET, POST, OPTIONS", |
|
|
"Access-Control-Allow-Headers": "Content-Type, Authorization", |
|
|
}; |
|
|
|
|
|
|
|
|
const sendJSON = (statusCode: number, data: any) => { |
|
|
res.writeHead(statusCode, { "Content-Type": "application/json", ...corsHeaders }); |
|
|
res.end(JSON.stringify(data)); |
|
|
}; |
|
|
|
|
|
|
|
|
const sendHTML = (html: string) => { |
|
|
res.writeHead(200, { "Content-Type": "text/html", ...corsHeaders }); |
|
|
res.end(html); |
|
|
}; |
|
|
|
|
|
|
|
|
if (url.pathname === "/" && method === "GET") { |
|
|
return sendHTML(HTML_FRONTEND); |
|
|
} |
|
|
|
|
|
|
|
|
if (method === "OPTIONS") { |
|
|
res.writeHead(204, corsHeaders); |
|
|
res.end(); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const authHeader = req.headers["authorization"]; |
|
|
if (url.pathname.startsWith("/v1/") && authHeader !== `Bearer ${API_KEY}`) { |
|
|
return sendJSON(401, { error: "Unauthorized" }); |
|
|
} |
|
|
|
|
|
|
|
|
if (url.pathname === "/health") { |
|
|
return sendJSON(200, { status: "online", model: "distributed-v1" }); |
|
|
} |
|
|
|
|
|
|
|
|
if (url.pathname === "/v1/chat/completions" && method === "POST") { |
|
|
let body = ""; |
|
|
req.on("data", (chunk) => { body += chunk; }); |
|
|
req.on("end", async () => { |
|
|
try { |
|
|
log(`INCOMING REQUEST (Size: ${body.length})`); |
|
|
const incomingVqd = req.headers["x-vqd-4"] as string | undefined; |
|
|
|
|
|
const jsonBody = JSON.parse(body); |
|
|
|
|
|
if (jsonBody.stream) { |
|
|
const { stream, vqd } = await openAIService.createChatCompletionStream(jsonBody, incomingVqd); |
|
|
|
|
|
res.writeHead(200, { |
|
|
"Content-Type": "text/event-stream", |
|
|
...corsHeaders, |
|
|
"x-vqd-4": vqd || "", |
|
|
"X-Content-Type-Options": "nosniff" |
|
|
}); |
|
|
|
|
|
const reader = stream.getReader(); |
|
|
try { |
|
|
while (true) { |
|
|
const { done, value } = await reader.read(); |
|
|
if (done) break; |
|
|
res.write(value); |
|
|
} |
|
|
} finally { |
|
|
res.end(); |
|
|
reader.releaseLock(); |
|
|
} |
|
|
return; |
|
|
} |
|
|
|
|
|
const { completion, vqd } = await openAIService.createChatCompletion(jsonBody, incomingVqd); |
|
|
|
|
|
log(`SUCCESS: Sent response for ${jsonBody.model}`); |
|
|
|
|
|
res.writeHead(200, { |
|
|
"Content-Type": "application/json", |
|
|
...corsHeaders, |
|
|
"x-vqd-4": vqd || "" |
|
|
}); |
|
|
res.write(JSON.stringify(completion)); |
|
|
res.end(); |
|
|
} catch (error: any) { |
|
|
log(`ERROR: ${error.message}`); |
|
|
res.writeHead(500, { "Content-Type": "application/json", ...corsHeaders }); |
|
|
res.write(JSON.stringify({ error: error.message, details: error.stack })); |
|
|
res.end(); |
|
|
} |
|
|
}); |
|
|
return; |
|
|
} |
|
|
|
|
|
if (url.pathname === "/v1/diagnose" && method === "GET") { |
|
|
log("RUNNING SYSTEM DIAGNOSTICS..."); |
|
|
const report: any = { |
|
|
status: "running", |
|
|
checks: {} |
|
|
}; |
|
|
|
|
|
|
|
|
report.checks.node = { |
|
|
version: process.version, |
|
|
memory: process.memoryUsage(), |
|
|
uptime: process.uptime() |
|
|
}; |
|
|
|
|
|
|
|
|
try { |
|
|
const start = Date.now(); |
|
|
|
|
|
|
|
|
const ipRes = await fetch("https://api.ipify.org?format=json"); |
|
|
const ipData = await ipRes.json() as any; |
|
|
|
|
|
const res = await fetch("https://duckduckgo.com/duckchat/v1/status?q=1", { |
|
|
headers: { |
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", |
|
|
"x-vqd-accept": "1" |
|
|
} |
|
|
}); const hash = res.headers.get("x-vqd-hash-1"); |
|
|
report.checks.duckduckgo = { |
|
|
status: res.status, |
|
|
latency_ms: Date.now() - start, |
|
|
vqd_present: !!hash, |
|
|
ip_blocked: res.status === 403 || res.status === 418, |
|
|
server_ip: ipData.ip |
|
|
}; |
|
|
} catch (e: any) { |
|
|
report.checks.duckduckgo = { error: e.message }; |
|
|
} |
|
|
|
|
|
try { |
|
|
const { JSDOM } = require("jsdom"); |
|
|
const dom = new JSDOM("<!DOCTYPE html><canvas id='c'></canvas>"); |
|
|
const canvas = dom.window.document.getElementById('c'); |
|
|
const ctx = canvas.getContext('2d'); |
|
|
report.checks.jsdom = { |
|
|
ok: true, |
|
|
canvas_created: !!canvas, |
|
|
context_2d: !!ctx |
|
|
}; |
|
|
} catch (e: any) { |
|
|
report.checks.jsdom = { error: e.message }; |
|
|
} |
|
|
|
|
|
sendJSON(200, report); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
res.writeHead(404, corsHeaders); res.end(); |
|
|
|
|
|
} catch (error: any) { |
|
|
log(`CRITICAL ERR: ${error.message}`); |
|
|
res.writeHead(500, { "Content-Type": "application/json" }); |
|
|
res.end(JSON.stringify({ error: "Internal Server Error" })); |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
process.on('uncaughtException', (err) => { |
|
|
log(`CRITICAL: Uncaught Exception: ${err.message}\n${err.stack}`); |
|
|
}); |
|
|
|
|
|
process.on('unhandledRejection', (reason, promise) => { |
|
|
log(`CRITICAL: Unhandled Rejection: ${reason}`); |
|
|
}); |
|
|
|
|
|
server.listen(PORT, () => { |
|
|
log(`API Gateway started on port ${PORT}`); |
|
|
}); |
|
|
|