Email / backup /server_email_v1.js
lenzcom's picture
Upload folder using huggingface_hub
32cf8db verified
import express from 'express';
import { SystemMessage, HumanMessage, Runnable, LlamaCppLLM } from './src/index.js';
import bodyParser from 'body-parser';
import path from 'path';
import fs from 'fs';
// Classify Logic
class EmailClassifierRunnable extends Runnable {
constructor(llm) {
super();
this.llm = llm;
}
async _call(input, config) {
// Mock fallback if model fails
if (!this.llm) return { category: "Error", confidence: 0, reason: "Model not initialized" };
const messages = this._buildPrompt(input);
const response = await this.llm.invoke(messages, config);
return this._parseClassification(response.content);
}
_buildPrompt(email) {
return [
new SystemMessage(`You are an email classification assistant. Classify into: Spam, Invoice, Meeting Request, Urgent, Personal, Other. Respond in JSON like {"category": "X", "confidence": 0.9, "reason": "Y"}.`),
new HumanMessage(`Classify:\nSubject: ${email.subject}\nBody: ${email.body}`)
];
}
_parseClassification(response) {
try {
const jsonMatch = response.match(/\{[\s\S]*\}/);
if (!jsonMatch) throw new Error('No JSON found');
return JSON.parse(jsonMatch[0]);
} catch (e) { return { category: 'Other', confidence: 0, reason: 'Failed to parse JSON', raw: response }; }
}
}
const app = express();
const PORT = 7860;
app.use(bodyParser.json());
let classifier = null;
async function initModel() {
try {
console.log("Loading model...");
// Ensure model exists
if (!fs.existsSync('./models/Qwen3-1.7B-Q8_0.gguf')) {
console.error("Model file missing!");
return;
}
const llm = new LlamaCppLLM({
modelPath: './models/Qwen3-1.7B-Q8_0.gguf',
temperature: 0.1,
maxTokens: 200
});
// Warmup
await llm.invoke("Hi");
classifier = new EmailClassifierRunnable(llm);
console.log("Model loaded successfully!");
} catch (err) {
console.error("Failed to load model:", err);
}
}
app.post('/classify', async (req, res) => {
if (!classifier) return res.status(503).json({ error: "Model loading or failed" });
try {
const { subject, body } = req.body;
const result = await classifier.invoke({ subject, body, from: 'api' });
res.json(result);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.get('/', (req, res) => res.send('AI Email Classifier Running. POST /classify to use.'));
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server listening on ${PORT}`);
initModel();
});