chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
const { validatedRequest } = require("../../utils/middleware/validatedRequest");
|
||||
const {
|
||||
flexUserRoleValid,
|
||||
ROLES,
|
||||
} = require("../../utils/middleware/multiUserProtected");
|
||||
const { reqBody } = require("../../utils/http");
|
||||
const { safeJsonParse, decodeHtmlEntities } = require("../../utils/http");
|
||||
|
||||
function dockerModelRunnerUtilsEndpoints(app) {
|
||||
if (!app) return;
|
||||
const {
|
||||
parseDockerModelRunnerEndpoint,
|
||||
} = require("../../utils/AiProviders/dockerModelRunner");
|
||||
|
||||
app.post(
|
||||
"/utils/dmr/download-model",
|
||||
[validatedRequest, flexUserRoleValid([ROLES.admin])],
|
||||
async (request, response) => {
|
||||
try {
|
||||
const { modelId, basePath = "" } = reqBody(request);
|
||||
const dmrUrl = new URL(
|
||||
parseDockerModelRunnerEndpoint(
|
||||
basePath ?? process.env.DOCKER_MODEL_RUNNER_BASE_PATH,
|
||||
"dmr"
|
||||
)
|
||||
);
|
||||
dmrUrl.pathname = "/models/create";
|
||||
response.writeHead(200, {
|
||||
"Content-Type": "text/event-stream",
|
||||
"Cache-Control": "no-cache",
|
||||
Connection: "keep-alive",
|
||||
});
|
||||
|
||||
const dmrResponse = await fetch(dmrUrl.toString(), {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ from: String(modelId) }),
|
||||
});
|
||||
if (!dmrResponse.ok)
|
||||
throw new Error(
|
||||
dmrResponse.statusText ||
|
||||
"An error occurred while downloading the model"
|
||||
);
|
||||
const reader = dmrResponse.body.getReader();
|
||||
let done = false;
|
||||
while (!done) {
|
||||
const { value, done: readerDone } = await reader.read();
|
||||
if (readerDone) done = true;
|
||||
|
||||
const chunk = new TextDecoder("utf-8").decode(value);
|
||||
const lines = chunk.split("\n");
|
||||
for (const line of lines) {
|
||||
if (!line.trim()) continue;
|
||||
const decodedLine = decodeHtmlEntities(line);
|
||||
const data = safeJsonParse(decodedLine);
|
||||
if (!data) continue;
|
||||
|
||||
if (data.type === "error") {
|
||||
throw new Error(
|
||||
data.message || "An error occurred while downloading the model"
|
||||
);
|
||||
} else if (data.type === "success") {
|
||||
response.write(
|
||||
`data: ${JSON.stringify({ type: "success", percentage: 100, message: "Model downloaded successfully" })}\n\n`
|
||||
);
|
||||
done = true;
|
||||
} else if (data.type === "progress") {
|
||||
const percentage =
|
||||
data.total > 0
|
||||
? Math.round((data.pulled / data.total) * 100)
|
||||
: 0;
|
||||
response.write(
|
||||
`data: ${JSON.stringify({ type: "progress", percentage, message: data.message })}\n\n`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
response.write(
|
||||
`data: ${JSON.stringify({ type: "error", message: e.message })}\n\n`
|
||||
);
|
||||
} finally {
|
||||
response.end();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
dockerModelRunnerUtilsEndpoints,
|
||||
};
|
||||
Reference in New Issue
Block a user