import express from "express" import { HfInference } from '@huggingface/inference' import { daisy } from "./daisy.mts" const hfi = new HfInference(process.env.HF_API_TOKEN) console.log('HF_ENDPOINT_URL:', process.env.HF_ENDPOINT_URL) const hf = hfi.endpoint(process.env.HF_ENDPOINT_URL) // define the CSS and JS dependencies const css = [ "/css/daisyui@2.6.0.css", ].map(item => ``) .join("") const script = [ "/js/alpinejs@3.12.2.js", "/js/tailwindcss@3.3.2.js" ].map(item => ``) .join("") const app = express() const port = 7860 const minPromptSize = 16 // if you change this, you will need to also change in public/index.html const timeoutInSec = 30 * 60 console.log("timeout set to 30 minutes") app.use(express.static("public")) const pending: { total: number; queue: string[]; } = { total: 0, queue: [], } const endRequest = (id: string, reason: string) => { if (!id || !pending.queue.includes(id)) { return } pending.queue = pending.queue.filter(i => i !== id) console.log(`request ${id} ended (${reason})`) } app.get("/debug", (req, res) => { res.write(JSON.stringify({ nbTotal: pending.total, nbPending: pending.queue.length, queue: pending.queue, })) res.end() }) app.get("/app", async (req, res) => { const model = `${req.query.model || 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5'}` console.log('model:', model) const endpoint = `${req.query.endpoint || ''}` console.log('endpoint:', endpoint) if (`${req.query.prompt}`.length < minPromptSize) { res.write(`prompt too short, please enter at least ${minPromptSize} characters`) res.end() return } const id = `${pending.total++}` console.log(`new request ${id}`) pending.queue.push(id) const prefix = `
${css}${script}` res.write(prefix) req.on("close", function() { // console.log("browser asked to close the stream for some reason.. let's ignore!") endRequest(id, "browser asked to end the connection") }) // for testing we kill after some delay setTimeout(() => { endRequest(id, `timed out after ${timeoutInSec}s`) }, timeoutInSec * 1000) const finalPrompt = `# Task Generate the following: ${req.query.prompt} # API Documentation ${daisy} # Guidelines - Never repeat the instruction, instead directly write the final code - Use a color scheme consistent with the brief and theme - You must use Tailwind CSS and Daisy UI for the CSS classes, vanilla JS and Alpine.js for the JS. - All the JS code will be written directly inside the page, using - You MUST use English, not Latin! (I repeat: do NOT write lorem ipsum!) - No need to write code comments, so please make the code compact (short function names etc) - Use a central layout by wrapping everything in a \`