./kaisetsu-app/src/lib/config.ts
function required(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(`Missing required environment variable: ${name}`);
}
return value;
}
export const STORAGE_BACKEND = (process.env.STORAGE_BACKEND ?? 'local') as 'local' | 'gcs';
// Local-only: where to put jobs/videos on disk (relative to cwd)
export const LOCAL_DATA_DIR = process.env.LOCAL_DATA_DIR ?? '.data';
// Gemini model (both Vertex and API key modes)
export const GEMINI_MODEL = process.env.GEMINI_MODEL ?? 'gemini-3-pro-preview';
// Gemini API key mode (preferred for local — no GCP project needed)
export const GEMINI_API_KEY = process.env.GEMINI_API_KEY;
// Whisper backend: "openai" (API, default for local), "mlx" (mlx_whisper CLI), "cpu" (openai-whisper CLI)
export const WHISPER_BACKEND = (process.env.WHISPER_BACKEND ?? 'openai') as 'openai' | 'mlx' | 'cpu';
export const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
// Vertex AI mode (production) — optional locally
export const GCP_PROJECT_ID = process.env.GCP_PROJECT_ID;
export const GCP_REGION = process.env.GCP_REGION ?? 'us-central1';
export const VERTEX_AI_LOCATION = process.env.VERTEX_AI_LOCATION ?? 'global';
// GCS-only
export const GCS_BUCKET_NAME = process.env.GCS_BUCKET_NAME;
// Cloud Run Job-only (production background processing)
export const CLOUD_RUN_JOB_NAME = process.env.CLOUD_RUN_JOB_NAME ?? 'kaisetsu-job-gpu';
export const SIGNING_SERVICE_ACCOUNT_EMAIL = process.env.SIGNING_SERVICE_ACCOUNT_EMAIL;
// Required helpers — throw only when that backend is actually used
export function requiredGcp() {
return {
projectId: required('GCP_PROJECT_ID'),
bucket: required('GCS_BUCKET_NAME'),
};
}
export function requiredGeminiApiKey(): string {
return required('GEMINI_API_KEY');
}