perplexity-hackathon-LawMitra / perplexity_hackathon / src / config / index.ts
index.ts
Raw
import dotenv from 'dotenv';
import path from 'path';

// Load environment variables from .env file
dotenv.config();

interface Config {
  port: number;
  nodeEnv: string;
  perplexityApiKey: string;
  openai: {
    apiKey: string;
  };
  elevenlabs: {
    apiKey: string;
    defaultVoice: string;
    model: string;
  };
  twilio: {
    accountSid: string;
    authToken: string;
    phoneNumber: string;
  };
  sessionTimeout: number;
  upload: {
    maxFileSizeMB: number;
    allowedAudioFormats: string[];
  };
}

const config: Config = {
  port: parseInt(process.env.PORT || '3000', 10),
  nodeEnv: process.env.NODE_ENV || 'development',
  perplexityApiKey: process.env.PERPLEXITY_API_KEY || '',
  openai: {
    apiKey: process.env.OPENAI_API_KEY || '',
  },
  elevenlabs: {
    apiKey: process.env.ELEVENLABS_API_KEY || '',
    defaultVoice: process.env.ELEVENLABS_DEFAULT_VOICE || 'EXAVITQu4vr4xnSDxMaL',
    model: process.env.ELEVENLABS_MODEL || 'eleven_multilingual_v2',
  },
  twilio: {
    accountSid: process.env.TWILIO_ACCOUNT_SID || '',
    authToken: process.env.TWILIO_AUTH_TOKEN || '',
    phoneNumber: process.env.TWILIO_PHONE_NUMBER || '',
  },
  sessionTimeout: parseInt(process.env.SESSION_TIMEOUT_MINUTES || '60', 10),
  upload: {
    maxFileSizeMB: parseInt(process.env.MAX_FILE_SIZE_MB || '10', 10),
    allowedAudioFormats: (process.env.ALLOWED_AUDIO_FORMATS || 'mp3,wav,m4a,ogg').split(','),
  },
};

// Validate required environment variables
const requiredEnvVars = [
  'PERPLEXITY_API_KEY',
  'OPENAI_API_KEY',
  'ELEVENLABS_API_KEY',
  'TWILIO_ACCOUNT_SID',
  'TWILIO_AUTH_TOKEN',
  'TWILIO_PHONE_NUMBER',
];

const missingEnvVars = requiredEnvVars.filter(
  (envVar) => !process.env[envVar]
);

if (missingEnvVars.length > 0) {
  throw new Error(
    `Missing required environment variables: ${missingEnvVars.join(', ')}`
  );
}

export default config;