File size: 2,983 Bytes
7d7d13d
 
b2351ee
7d7d13d
 
 
b2351ee
7d7d13d
 
b53253f
7d944f7
 
b2351ee
7d7d13d
7d944f7
7d7d13d
7d944f7
3cd9b91
7d944f7
3cd9b91
 
7d7d13d
7d944f7
 
7d7d13d
 
7d944f7
7d7d13d
7d944f7
 
 
 
 
 
 
7d7d13d
7d944f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7d7d13d
 
 
 
7d944f7
b53253f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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);
});