JS-Coder-Backend / server.js
Emalawi19's picture
Update server.js
c2da371 verified
Raw
History Blame
3.2 kB
import { pipeline } from '@huggingface/transformers';
import http from 'http';
// Configuration
const PORT = 7860;
// Instruction-following model: understands "generate a login page" and responds correctly
const MODEL_NAME = 'onnx-community/Qwen2.5-0.5B-Instruct';
let generator;
// Initialize the model on startup
async function loadModel() {
console.log("Loading coding model...");
generator = await pipeline('text-generation', MODEL_NAME, { dtype: 'q4' });
console.log("Model loaded successfully!");
}
const server = http.createServer(async (req, res) => {
// 1. Add CORS headers so external websites can talk to this API
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
// Handle preflight requests for the API
if (req.method === 'OPTIONS') {
res.writeHead(200);
return res.end();
}
res.setHeader('Content-Type', 'application/json');
// Clean the URL (Removes Hugging Face's ?__theme=light additions)
const pathname = req.url.split('?')[0];
// 2. Your requested Status Check
if (pathname === '/' && req.method === 'GET') {
res.writeHead(200);
res.end(JSON.stringify({ "status": " Backend is running" }));
return;
}
// 3. Code Generation Endpoint
if (pathname === '/generate' && req.method === 'POST') {
let body = '';
req.on('data', chunk => { body += chunk.toString(); });
req.on('end', async () => {
try {
const { prompt } = JSON.parse(body);
if (!generator) {
res.writeHead(503);
return res.end(JSON.stringify({ error: "Model is still loading..." }));
}
// Use chat format so the model understands instructions properly
const messages = [
{ role: 'system', content: 'You are an expert JavaScript and web developer. When asked to generate code, respond with clean, complete, working code only. No explanations unless asked.' },
{ role: 'user', content: prompt }
];
const output = await generator(messages, {
max_new_tokens: 1000, // More tokens for complete code output
temperature: 0.7,
do_sample: true
});
// Extract only the assistant's reply
const result = output[0].generated_text.at(-1).content;
res.writeHead(200);
res.end(JSON.stringify({ result }));
} catch (err) {
res.writeHead(400);
res.end(JSON.stringify({ error: "Invalid JSON or request", detail: err.message }));
}
});
return;
}
// Default 404
res.writeHead(404);
res.end(JSON.stringify({ error: "Not Found", requested_path: pathname }));
});
// Start everything
loadModel().then(() => {
server.listen(PORT, '0.0.0.0', () => {
console.log(`Server running at http://0.0.0.0:${PORT}`);
});
});