| 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...'); |
|
|
| |
| app.get('/', (req, res) => { |
| res.json({ name: 'Tera V2 API', version: '2.0.0', model: MODEL, status: 'running' }); |
| }); |
|
|
| |
| app.get('/health', (req, res) => { |
| res.json({ status: 'ok', service: 'Tera V2', model: MODEL }); |
| }); |
|
|
| |
| app.post('/api/chat', async (req, res) => { |
| try { |
| const { messages, sources } = req.body; |
| |
| |
| 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)); |
| |
| |
| 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); |
| |
| 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); |
| }); |