Spaces:
Running
Running
File size: 1,725 Bytes
149698e f67c466 149698e 47b1169 149698e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import { z } from 'zod';
import dotenv from 'dotenv';
import { resolve, dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
// Load .env from monorepo root (3 levels up from src/config/)
dotenv.config({ path: resolve(__dirname, '../../../../.env') });
const envSchema = z.object({
PORT: z.coerce.number().default(3001),
DATABASE_URL: z.string().default('sqlite.db'),
JWT_SECRET: z.string().default('dev-secret-change-in-production-min32chars'),
VITE_GOOGLE_CLIENT_ID: z.string().optional(),
GOOGLE_CLIENT_SECRET: z.string().optional(),
// AI Provider routing
AI_PRIMARY_PROVIDER: z.string().default('groq'),
AI_FALLBACK_PROVIDER: z.string().default('mistral'),
AI_AUTO_ROTATE: z.coerce.boolean().default(true),
AI_TIER: z.enum(['free', 'paid']).default('free'),
// Groq (free tier)
GROQ_API_KEY: z.string().optional(),
GROQ_MODEL: z.string().default('llama-3.3-70b-versatile'),
// Mistral (free tier)
MISTRAL_API_KEY: z.string().optional(),
MISTRAL_MODEL: z.string().default('mistral-small-latest'),
// Other AI keys (paid / optional)
AI_PROVIDER: z
.enum(['groq', 'mistral', 'anthropic', 'openai', 'google', 'openrouter', 'ollama'])
.default('groq'),
ANTHROPIC_API_KEY: z.string().optional(),
OPENAI_API_KEY: z.string().optional(),
GOOGLE_AI_API_KEY: z.string().optional(),
OPENROUTER_API_KEY: z.string().optional(),
OLLAMA_BASE_URL: z.string().default('http://localhost:11434'),
APP_URL: z.string().default('http://localhost:5173'),
SCAN_INTERVAL_MINUTES: z.coerce.number().default(5),
});
export const config = envSchema.parse(process.env);
export type Config = z.infer<typeof envSchema>;
|