| | import express from 'express'; |
| | import axios from 'axios'; |
| | import { v4 as uuidv4 } from 'uuid'; |
| |
|
| | const app = express(); |
| |
|
| | |
| | app.use(express.json()); |
| | app.use(express.text()); |
| |
|
| | const modelMapping = { |
| | "gpt-4o-mini": "GPT-4o mini", |
| | "claude-haiku": "Claude Haiku", |
| | "llama-3": "Llama 3", |
| | "gemini-1.5": "Gemini 1.5", |
| | "gemini-flash": "Gemini Flash", |
| | "command-r": "Command R", |
| | "o3-mini": "o3-mini", |
| | "o1": "o1", |
| | "GPT-4":"GPT-4" |
| | }; |
| |
|
| | |
| | const authMiddleware = (req, res, next) => { |
| | const authToken = process.env.AUTH_TOKEN; |
| | if (authToken) { |
| | const requestToken = req.headers.authorization || ''; |
| | const token = requestToken.replace('Bearer ', ''); |
| | if (token !== authToken) { |
| | return res.status(401).send('Access Denied'); |
| | } |
| | } |
| | next(); |
| | }; |
| |
|
| | |
| | const getTempUserID = async () => { |
| | const response = await axios.get('https://playground.julius.ai/api/temp_user_id'); |
| | return response.data.temp_user_id; |
| | }; |
| |
|
| | |
| | const splitIntoChunks = (text, chunkSize) => { |
| | const chars = Array.from(text); |
| | const chunks = []; |
| | for (let i = 0; i < chars.length; i += chunkSize) { |
| | chunks.push(chars.slice(i, i + chunkSize).join('')); |
| | } |
| | return chunks; |
| | }; |
| |
|
| | |
| | const sendToJulius = async (tempUserID, message, model) => { |
| | const conversationID = uuidv4(); |
| | const data = { |
| | message: { |
| | content: message, |
| | role: "user" |
| | }, |
| | provider: "default", |
| | chat_mode: "auto", |
| | client_version: "20240130", |
| | theme: "dark", |
| | new_images: null, |
| | new_attachments: null, |
| | dataframe_format: "json", |
| | selectedModels: [model] |
| | }; |
| |
|
| | const response = await axios({ |
| | method: 'post', |
| | url: 'https://playground.julius.ai/api/chat/message', |
| | data, |
| | headers: { |
| | 'is-demo': tempUserID, |
| | 'conversation-id': conversationID, |
| | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', |
| | 'interactive-charts': 'true', |
| | 'use-dict': 'true', |
| | 'Gcs': 'true', |
| | 'Is-Native': 'false', |
| | 'sec-ch-ua-platform': 'Windows' |
| | }, |
| | responseType: 'text' |
| | }); |
| |
|
| | return response.data.split('\n') |
| | .filter(line => line.trim()) |
| | .map(line => { |
| | try { return JSON.parse(line); } |
| | catch { return null; } |
| | }) |
| | .filter(Boolean) |
| | .reduce((acc, item) => acc + (item.content || ''), ''); |
| | }; |
| |
|
| | |
| | app.post('/v1/chat/completions', authMiddleware, async (req, res) => { |
| | try { |
| | const { messages, model: originalModel, stream } = req.body; |
| | const model = modelMapping[originalModel] || originalModel; |
| | const tempUserID = await getTempUserID(); |
| | const content = messages[messages.length - 1].content; |
| |
|
| | |
| | const juliusResp = await sendToJulius(tempUserID, content, model); |
| |
|
| | |
| | if (stream) { |
| | res.setHeader('Content-Type', 'text/event-stream'); |
| | res.setHeader('Cache-Control', 'no-cache'); |
| | res.setHeader('Connection', 'keep-alive'); |
| |
|
| | const respId = `chatcmpl-${tempUserID}`; |
| | const created = Math.floor(Date.now() / 1000); |
| | const chunks = splitIntoChunks(juliusResp, 50); |
| |
|
| | |
| | res.write(`data: ${JSON.stringify({ |
| | id: respId, |
| | object: "chat.completion.chunk", |
| | created, |
| | model, |
| | choices: [{ delta: { role: "assistant" }, index: 0 }] |
| | })}\n\n`); |
| |
|
| | |
| | chunks.forEach((chunk, index) => { |
| | res.write(`data: ${JSON.stringify({ |
| | id: respId, |
| | object: "chat.completion.chunk", |
| | created, |
| | model, |
| | choices: [{ |
| | delta: { content: chunk }, |
| | index: 0, |
| | finish_reason: index === chunks.length - 1 ? "stop" : null |
| | }] |
| | })}\n\n`); |
| | }); |
| |
|
| | |
| | res.write('data: [DONE]\n\n'); |
| | return res.end(); |
| | } |
| |
|
| | |
| | res.json({ |
| | id: `chatcmpl-${tempUserID}`, |
| | object: "chat.completion", |
| | created: Math.floor(Date.now() / 1000), |
| | model, |
| | choices: [{ |
| | message: { |
| | role: "assistant", |
| | content: juliusResp |
| | }, |
| | finish_reason: "stop", |
| | index: 0 |
| | }] |
| | }); |
| |
|
| | } catch (error) { |
| | console.error('Error:', error); |
| | res.status(500).json({ error: error.message }); |
| | } |
| | }); |
| |
|
| | |
| | app.all('*', (req, res) => { |
| | res.json({ |
| | status: "Julius2Api Service Running...", |
| | message: "MoLoveSze..." |
| | }); |
| | }); |
| |
|
| | |
| | const PORT = process.env.PORT || 3000; |
| | app.listen(PORT, () => { |
| | console.log(`Server running on port ${PORT}`); |
| | }); |