feat(api): add bearer auth option and /v1/models endpoint

This commit is contained in:
2026-02-25 10:43:19 +00:00
parent f09972c083
commit 32af5fde6d

View File

@@ -2,12 +2,19 @@ import http from "node:http";
const port = Number(process.env.PORT || 8787); const port = Number(process.env.PORT || 8787);
const modelName = process.env.NO_REPLY_MODEL || "whispergate-no-reply-v1"; const modelName = process.env.NO_REPLY_MODEL || "whispergate-no-reply-v1";
const authToken = process.env.AUTH_TOKEN || "";
function sendJson(res, status, payload) { function sendJson(res, status, payload) {
res.writeHead(status, { "Content-Type": "application/json; charset=utf-8" }); res.writeHead(status, { "Content-Type": "application/json; charset=utf-8" });
res.end(JSON.stringify(payload)); res.end(JSON.stringify(payload));
} }
function isAuthorized(req) {
if (!authToken) return true;
const header = req.headers.authorization || "";
return header === `Bearer ${authToken}`;
}
function noReplyChatCompletion(reqBody) { function noReplyChatCompletion(reqBody) {
return { return {
id: `chatcmpl_whispergate_${Date.now()}`, id: `chatcmpl_whispergate_${Date.now()}`,
@@ -42,15 +49,38 @@ function noReplyResponses(reqBody) {
}; };
} }
function listModels() {
return {
object: "list",
data: [
{
id: modelName,
object: "model",
created: Math.floor(Date.now() / 1000),
owned_by: "whispergate"
}
]
};
}
const server = http.createServer((req, res) => { const server = http.createServer((req, res) => {
if (req.method === "GET" && req.url === "/health") { if (req.method === "GET" && req.url === "/health") {
return sendJson(res, 200, { ok: true, service: "whispergate-no-reply-api" }); return sendJson(res, 200, { ok: true, service: "whispergate-no-reply-api", model: modelName });
}
if (req.method === "GET" && req.url === "/v1/models") {
if (!isAuthorized(req)) return sendJson(res, 401, { error: "unauthorized" });
return sendJson(res, 200, listModels());
} }
if (req.method !== "POST") { if (req.method !== "POST") {
return sendJson(res, 404, { error: "not_found" }); return sendJson(res, 404, { error: "not_found" });
} }
if (!isAuthorized(req)) {
return sendJson(res, 401, { error: "unauthorized" });
}
let body = ""; let body = "";
req.on("data", (chunk) => { req.on("data", (chunk) => {
body += chunk; body += chunk;