moelove's picture
feat: add summarization profile support and API endpoint for conversation summaries
2316bca
raw
history blame
4.19 kB
import express from 'express';
import cors from 'cors';
import fetch from 'node-fetch';
import path from 'path'
import { fileURLToPath } from 'url'
const app = express();
const port = 7860;
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
app.use(cors());
app.use(express.json());
app.post('/api/summarize', async (req, res) => {
const { content, apiEndpoint, apiKey, model } = req.body;
console.log('Received summarize request with:', {
apiEndpoint,
model,
contentLength: content.length
});
try {
let apiUrl;
if (apiEndpoint.endsWith('#')) {
apiUrl = apiEndpoint.slice(0, -1);
} else if (apiEndpoint.endsWith('/')) {
apiUrl = `${apiEndpoint}chat/completions`;
} else {
apiUrl = `${apiEndpoint}/v1/chat/completions`;
}
console.log('Calling API endpoint:', apiUrl);
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify({
model: model,
messages: [{
role: 'user',
content: `Summarize this conversation in 3-5 words: ${content}`
}],
temperature: 0.2,
max_tokens: 20
})
});
if (!response.ok) {
const errorData = await response.text();
console.error('API error:', {
status: response.status,
error: errorData
});
throw new Error(`API error: ${response.status} - ${errorData}`);
}
const data = await response.json();
const summary = data.choices[0].message.content.trim();
res.json({ summary });
} catch (error) {
console.error('Error:', error);
res.status(500).json({ error: error.message });
}
});
app.post('/api/chat', async (req, res) => {
const { messages, apiEndpoint, apiKey, model } = req.body;
console.log('Received chat request with:', {
apiEndpoint,
model,
messageCount: messages.length
});
try {
let apiUrl;
if (apiEndpoint.endsWith('#')) {
apiUrl = apiEndpoint.slice(0, -1);
} else if (apiEndpoint.endsWith('/')) {
apiUrl = `${apiEndpoint}chat/completions`;
} else {
apiUrl = `${apiEndpoint}/v1/chat/completions`;
}
console.log('Calling API endpoint:', apiUrl);
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`
},
body: JSON.stringify({
model: model,
messages: messages,
stream: true
})
});
console.log('API response status:', response.status);
console.log('API response headers:', Object.fromEntries(response.headers.entries()));
if (!response.ok) {
const errorData = await response.text();
console.error('API error:', {
status: response.status,
error: errorData
});
throw new Error(`API error: ${response.status} - ${errorData}`);
}
// Set headers for streaming
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
// Set SSE headers
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
// Pipe the API response to the client
response.body.pipe(res).on('error', (err) => {
console.error('Stream error:', err);
res.status(500).end();
}).on('end', () => {
console.log('Stream completed successfully');
});
} catch (error) {
console.error('Error:', error);
res.status(500).json({ error: error.message });
}
});
if (process.env.NODE_ENV === 'production') {
// Serve static files from the dist directory
app.use(express.static(path.join(__dirname, '../dist')))
// Handle all other routes by serving the index.html
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, '../dist/index.html'))
})
}
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});