const express = require('express'); const cors = require('cors'); const http = require('http'); require('dotenv').config(); const app = express(); app.use(cors()); app.use(express.json({ limit: '50mb' })); const PORT = process.env.PORT || 7860; const OLLAMA_HOST = '127.0.0.1'; const OLLAMA_PORT = 11434; const MODEL = process.env.MODEL || 'qwen3.5:0.8b'; console.log('Tera V2 Starting...'); // Root route app.get('/', (req, res) => { res.json({ name: 'Tera V2 API', version: '2.0.0', model: MODEL, status: 'running' }); }); // Health check app.get('/health', (req, res) => { res.json({ status: 'ok', service: 'Tera V2', model: MODEL }); }); // SIMPLE CHAT (Non-streaming - works better) app.post('/api/chat', async (req, res) => { try { const { messages, sources } = req.body; // Build prompt let context = ''; if (sources && sources.length > 0) { context = '\n\nDOCUMENTS:\n' + sources.map(s => s.name + ':\n' + (s.content?.substring(0, 2000) || '')).join('\n\n'); } const prompt = `You are Tera V2, an AI assistant.${context}\n\nUser: ${messages[messages.length-1].content}\n\nTera V2:`; console.log('Processing:', messages[messages.length-1].content.substring(0, 50)); // Call Ollama const requestData = JSON.stringify({ model: MODEL, prompt: prompt, stream: false, options: { temperature: 0.7, num_predict: 2048 } }); const options = { hostname: OLLAMA_HOST, port: OLLAMA_PORT, path: '/api/generate', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(requestData) }, timeout: 120000 }; const proxyReq = http.request(options, (proxyRes) => { let data = ''; proxyRes.on('data', chunk => data += chunk); proxyRes.on('end', () => { try { const response = JSON.parse(data); // Return in same format as before for compatibility res.json({ content: response.response, done: true }); } catch (e) { res.status(500).json({ error: 'Failed to parse response' }); } }); }); proxyReq.on('error', (e) => { console.error('Ollama error:', e.message); res.status(500).json({ error: e.message }); }); proxyReq.write(requestData); proxyReq.end(); } catch (error) { console.error('Error:', error.message); res.status(500).json({ error: error.message }); } }); app.listen(PORT, () => { console.log('Tera V2 Ready on port', PORT); });