ai-app-factory / src /index.mts
jbilcke-hf's picture
jbilcke-hf HF staff
initial commit
9c9e5d3
raw
history blame
No virus
2.02 kB
import express from 'express'
import { HfInference } from '@huggingface/inference'
import { createSpace } from './createSpace.mts'
import { RepoFile } from './types.mts'
import { generateFiles } from './generateFiles.mts'
const hfi = new HfInference(process.env.HF_API_TOKEN)
const hf = hfi.endpoint(process.env.HF_ENDPOINT_URL)
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 = 15 * 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) => {
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)
req.on('close', function() {
endRequest(id, 'browser asked to end the connection')
})
setTimeout(() => {
endRequest(id, `timed out after ${timeoutInSec}s`)
}, timeoutInSec * 1000)
let nbAttempts = 3
let files = []
while (nbAttempts-- > 0) {
files = await generateFiles(`${req.query.prompt ||Β ""}`)
if (files.length) {
console.log(`seems like we have ${files.length} files`)
break
}
}
console.log("files:", JSON.stringify(files, null, 2))
await createSpace(files)
res.write(JSON.stringify(files, null, 2))
res.end()
})
app.listen(port, () => { console.log(`Open http://localhost:${port}`) })