95 lines
2.9 KiB
JavaScript
95 lines
2.9 KiB
JavaScript
const path = require('path');
|
|
const { spawn } = require('child_process');
|
|
const fs = require('fs');
|
|
|
|
const fastapiDir = path.join(__dirname, 'servers/fastapi');
|
|
const nextjsDir = path.join(__dirname, 'servers/nextjs');
|
|
|
|
const isDev = process.env.NODE_ENV === 'development';
|
|
const canChangeKeys = process.env.CAN_CHANGE_KEYS !== 'false';
|
|
|
|
const fastapiPort = 8000;
|
|
const nextjsPort = 3000;
|
|
|
|
const userConfigPath = path.join(process.env.APP_DATA_DIRECTORY, 'userConfig.json');
|
|
const userDataDir = path.dirname(userConfigPath);
|
|
|
|
// Create user_data directory if it doesn't exist
|
|
if (!fs.existsSync(userDataDir)) {
|
|
fs.mkdirSync(userDataDir, { recursive: true });
|
|
}
|
|
|
|
process.env.USER_CONFIG_PATH = userConfigPath;
|
|
|
|
//? UserConfig is only setup if API Keys can be changed
|
|
const setupUserConfigFromEnv = () => {
|
|
|
|
let existingConfig = {};
|
|
if (fs.existsSync(userConfigPath)) {
|
|
existingConfig = JSON.parse(fs.readFileSync(userConfigPath, 'utf8'));
|
|
}
|
|
|
|
if (!['ollama', 'openai', 'google'].includes(existingConfig.LLM)) {
|
|
existingConfig.LLM = undefined;
|
|
}
|
|
|
|
const userConfig = {
|
|
LLM: process.env.LLM || existingConfig.LLM,
|
|
OPENAI_API_KEY: process.env.OPENAI_API_KEY || existingConfig.OPENAI_API_KEY,
|
|
GOOGLE_API_KEY: process.env.GOOGLE_API_KEY || existingConfig.GOOGLE_API_KEY,
|
|
OLLAMA_URL: process.env.OLLAMA_URL || existingConfig.OLLAMA_URL,
|
|
OLLAMA_MODEL: process.env.OLLAMA_MODEL || existingConfig.OLLAMA_MODEL,
|
|
CUSTOM_LLM_URL: process.env.CUSTOM_LLM_URL || existingConfig.CUSTOM_LLM_URL,
|
|
CUSTOM_LLM_API_KEY: process.env.CUSTOM_LLM_API_KEY || existingConfig.CUSTOM_LLM_API_KEY,
|
|
CUSTOM_MODEL: process.env.CUSTOM_MODEL || existingConfig.CUSTOM_MODEL,
|
|
PEXELS_API_KEY: process.env.PEXELS_API_KEY || existingConfig.PEXELS_API_KEY,
|
|
USE_CUSTOM_URL: process.env.USE_CUSTOM_URL || existingConfig.USE_CUSTOM_URL,
|
|
};
|
|
|
|
fs.writeFileSync(userConfigPath, JSON.stringify(userConfig));
|
|
}
|
|
|
|
const startServers = async () => {
|
|
|
|
const fastApiProcess = spawn(
|
|
"python",
|
|
["server.py", "--port", fastapiPort.toString(), "--reload", isDev],
|
|
{
|
|
cwd: fastapiDir,
|
|
stdio: "inherit",
|
|
env: process.env,
|
|
}
|
|
);
|
|
|
|
fastApiProcess.on("error", err => {
|
|
console.error("FastAPI process failed to start:", err);
|
|
});
|
|
|
|
const nextjsProcess = spawn(
|
|
"npm",
|
|
["run", isDev ? "dev" : "start", "--", "-p", nextjsPort.toString()],
|
|
{
|
|
cwd: nextjsDir,
|
|
stdio: "inherit",
|
|
env: process.env,
|
|
}
|
|
);
|
|
|
|
nextjsProcess.on("error", err => {
|
|
console.error("Next.js process failed to start:", err);
|
|
});
|
|
|
|
// Keep the Node process alive until both servers exit
|
|
const exitCode = await Promise.race([
|
|
new Promise(resolve => fastApiProcess.on("exit", resolve)),
|
|
new Promise(resolve => nextjsProcess.on("exit", resolve)),
|
|
]);
|
|
|
|
console.log(`One of the processes exited. Exit code: ${exitCode}`);
|
|
process.exit(exitCode);
|
|
};
|
|
|
|
if (canChangeKeys) {
|
|
setupUserConfigFromEnv();
|
|
}
|
|
startServers();
|