66c9f735 by Bryan Batac

- Added Redis

- Modifed the getmodel implementation
1 parent d6d461cd
......@@ -17,7 +17,6 @@ function App() {
const [models, setModels] = useState([]);
const [temperature, setTemperature] = useState(0.7);
const GPTTurbo = "gpt-3.5-turbo";
const GPTTurbo0301 = "gpt-3.5-turbo-0301";
const [currentModel, setCurrentModel] = useState(GPTTurbo);
const [chatLog, setChatLog] = useState([{
user: "gpt",
......@@ -79,6 +78,11 @@ function App() {
submitPrompt();
}
const getEndpoint = (modelName) => {
const model = models.find((m) => m.id === modelName);
return model ? model.endpoint : null;
};
async function submitPrompt() {
const TPLogicRun = window.TPLogicRun;
......@@ -112,16 +116,13 @@ function App() {
setChatLog(prevChatLog => [...prevChatLog, userMessage]);
var messages = chatLogNew.map((message) => { if(message.user !== 'me') return message.message }).join("\n")
if(currentModel === GPTTurbo || currentModel === GPTTurbo0301) {
// "gpt-3.5-turbo"
let endpoint = getEndpoint(currentModel);
if(endpoint === "openAI") {
let chatLogTurboNew = [...chatLogTurbo, { role: "user", content: chatInput }];
setChatLogTurbo(chatLogTurboNew);
messages = JSON.stringify(chatLogTurboNew);
}
if(currentModel === "openchat_3.5" || currentModel === "zephyr-7B-beta"
|| currentModel === "meta-llama/Llama-3-8b-chat-hf" || currentModel === "google/gemma-2-9b-it") {
// "gpt-3.5-turbo"
if(endpoint === "Llama" || endpoint === "Opensource") {
let chatLogOpenSourceNew = [...chatLogOpenSource, { role: "user", content: chatInput }];
setChatLogOpenSource(chatLogOpenSourceNew);
messages = JSON.stringify(chatLogOpenSourceNew);
......
......@@ -3,6 +3,7 @@ const express = require('express')
const bodyParser = require('body-parser')
const cookieParser = require("cookie-parser")
const cors = require('cors')
const { createClient } = require('redis')
require('dotenv').config()
const rateLimit = require('express-rate-limit')
const fetch = require('node-fetch');
......@@ -48,6 +49,10 @@ const tiktokenModels = [
'gpt-3.5-turbo-0301'
];
let client;
let filteredModels = {};
const allowedEndpoints = ["openAI", "Opensource", "Llama"];
// Open AI Configuration
// console.log(process.env.OPENAI_API_ORG)
const configuration = new Configuration({
......@@ -85,18 +90,20 @@ app.post('/api', async (req, res) => {
return;
}
const { message, currentModel, temperature } = req.body;
const getEndpoint = (modelName) => {
const model = Object.values(filteredModels).find(m => m.model === modelName);
return model ? model.endpoint : 'Endpoint not found';
};
if (currentModel == "gpt-3.5-turbo" || currentModel == "gpt-3.5-turbo-0301") {
runGPTTurbo(req, res);
const endpoint = getEndpoint(currentModel);
if (endpoint == "openAI") {
runGPTTurbo(req, res);
return;
}
if (currentModel == "openchat_3.5" || currentModel == "zephyr-7B-beta"
|| currentModel == "google/gemma-2-9b-it" || currentModel == "meta-llama/Llama-3-8b-chat-hf"
) {
}
if (endpoint == "Llama" || endpoint == "Opensource") {
runOpensource(req, res);
return;
}
......@@ -267,18 +274,6 @@ async function runGPTTurbo(req, res) {
}
}
const get_endpoint_api_url = (currentModel) => {
const OPENSOURCE_ENDPOINTS = process.env.OPENSOURCE_ENDPOINTS;
const endpoints = JSON.parse(OPENSOURCE_ENDPOINTS);
const endpoint_api_url = endpoints?.[currentModel];
return endpoint_api_url
}
const get_endpoint_api_key = (currentModel) => {
const OPENSOURCE_API_KEY = process.env.OPENSOURCE_API_KEY;
const api_keys = JSON.parse(OPENSOURCE_API_KEY);
const key = api_keys?.[currentModel];
return key
}
async function runOpensource(req, res) {
const { message, currentModel, temperature, P6XcW47o: together_ai_response = null } = req.body;
var input = '';
......@@ -294,9 +289,9 @@ async function runOpensource(req, res) {
try {
let error_msg = "";
const endpoint_api_url = get_endpoint_api_url(currentModel);
const api_key = get_endpoint_api_key(currentModel);
const response = await axios.post(endpoint_api_url + '/chat/completions', {
const endpoint_api_url = process.env.OPENSOURCE_ENDPOINTS;
const api_key = OPENSOURCE_API_KEY;
const response = await axios.post(endpoint_api_url, {
model: currentModel,
messages: JSON.parse(message),
max_tokens: 2048,
......@@ -525,31 +520,17 @@ const getClientIP = (req) => {
// Get Models Route
app.get('/models', async (req, res) => {
const openai_models = process.env.OPENAI_MODELS ? JSON.parse(process.env.OPENAI_MODELS) : [{"value": "gpt-3.5-turbo", "label": "GPT-3.5"}];
const opensource_models = process.env.OPENSOURCE_MODELS ? JSON.parse(process.env.OPENSOURCE_MODELS) : [];
await getModels()
const models = {
data: []
data: Object.values(filteredModels).map((model) => ({
id: model.model,
label: model.name,
name: model.name,
beta: model.isBeta,
endpoint: model.endpoint
}))
};
openai_models.forEach((model) => {
models.data.push({
id: model.value,
label: model.label,
name: model.label,
beta: false,
});
})
opensource_models.forEach((model) => {
models.data.push({
id: model.value,
label: model.label,
name: model.label,
beta: true,
});
})
res.json({
models
})
......@@ -558,4 +539,53 @@ app.get('/models', async (req, res) => {
// Start the server
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
});
\ No newline at end of file
});
const initializeRedisClient = () => {
const newClient = createClient({
socket: {
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT,
},
username: process.env.REDIS_USER,
password: process.env.REDIS_PASS,
});
newClient.on('error', (err) => {
console.error('Redis error:', err);
});
return newClient;
};
const fetchAndFilterModels = async (client) => {
try {
await client.select(process.env.REDIS_DB);
const models = await client.get('model');
return Object.entries(JSON.parse(models))
.filter(([_, value]) => allowedEndpoints.includes(value.endpoint))
.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
} catch (err) {
console.error('Error fetching and filtering models:', err);
throw err;
}
};
const getModels = async () => {
if (!client) {
client = initializeRedisClient();
try {
await client.connect();
filteredModels = await fetchAndFilterModels(client);
console.log('Connected to Redis successfully');
} catch (err) {
console.error('Error connecting to Redis:', err);
throw err;
}
}
};
\ No newline at end of file
......
......@@ -21,7 +21,61 @@
"js-tiktoken": "1.0.7",
"morgan": "^1.10.0",
"node-fetch": "^2.7.0",
"openai": "^3.2.0"
"openai": "^3.2.0",
"redis": "^4.7.0"
}
},
"node_modules/@redis/bloom": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
"integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/client": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz",
"integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==",
"dependencies": {
"cluster-key-slot": "1.1.2",
"generic-pool": "3.9.0",
"yallist": "4.0.0"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@redis/graph": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz",
"integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/json": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz",
"integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/search": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz",
"integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/time-series": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz",
"integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/accepts": {
......@@ -145,6 +199,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/cluster-key-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
"integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
......@@ -458,6 +520,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/generic-pool": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
"integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
"engines": {
"node": ">= 4"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
......@@ -805,6 +875,22 @@
"node": ">= 0.8"
}
},
"node_modules/redis": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz",
"integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==",
"workspaces": [
"./packages/*"
],
"dependencies": {
"@redis/bloom": "1.2.0",
"@redis/client": "1.6.0",
"@redis/graph": "1.1.1",
"@redis/json": "1.0.7",
"@redis/search": "1.2.0",
"@redis/time-series": "1.1.0"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
......@@ -979,6 +1065,11 @@
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
}
......
......@@ -22,6 +22,7 @@
"js-tiktoken": "1.0.7",
"morgan": "^1.10.0",
"node-fetch": "^2.7.0",
"openai": "^3.2.0"
"openai": "^3.2.0",
"redis": "^4.7.0"
}
}
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!